#php #codeigniter
#php #codeigniter
Вопрос:
Я хочу создать аутентификацию пользователя с уровнем доступа для серверной части моего сайта. Я хочу получить и перечислить все имена классов контроллеров для создания группы пользователей.
Заранее спасибо,
Логан
Ответ №1:
Для этого лучше всего явно записать их в новый конфигурационный файл.
$config['controllers'] = array(
'blog',
'events',
'news', // etc.
);
В противном случае вы будете сканировать каталоги, которые будут потреблять ресурсы. Но вы могли бы сделать это следующим образом:
$controllers = array();
$this->load->helper('file');
// Scan files in the /application/controllers directory
// Set the second param to TRUE or remove it if you
// don't have controllers in sub directories
$files = get_dir_file_info(APPPATH.'controllers', FALSE);
// Loop through file names removing .php extension
foreach (array_keys($files) as $file)
{
$controllers[] = str_replace(EXT, '', $file);
}
print_r($controllers); // Array with all our controllers
Поскольку имена файлов совпадают с именами контроллеров, теперь у вас должен быть массив всех ваших контроллеров. Это не идеально, хотя по нескольким причинам, но должно работать для большинства настроек.
Лично я использую сильно измененную структуру каталогов, так что у меня это не сработало бы, и некоторые контроллеры я бы тоже хотел игнорировать. Другим вариантом было бы кэшировать результаты в файл, но это отдельный учебник.
Я настоятельно рекомендую определить их в файле конфигурации, таким образом, вы можете хранить другую полезную информацию, непосредственно связанную с вашим контролем доступа, и избежать огромных накладных расходов на рекурсивное сканирование каталогов.
Ответ №2:
Другой способ, которым вы могли бы это сделать, — создать интерфейс, который вы затем можете проверить в своей системе аутентификации, например, создать класс, подобный so:
interface IAuthorizationRequired
{
public function __auth();
}
Теперь создайте свой контроллер (псевдо)
class BlogController extends CI_Controller implements IAuthorizationRequired
{
public function __auth()
{
/*Redirect or Custom*/
}
}
и в вашем модуле авторизации вы загружаете текущий контроллер и выполняете последующее:
if(($controller instanceof IAuthorizationRequired) amp;amp; method_exists(array($controller,'__auth')))
{
$authed = $controller->__auth();
if(!$authed)
{
echo 'Authorization Failed';
exit;
}
}
В версии 2.0 вы можете переопределить базовый контроллер и добавить к нему свой метод __auth, а затем просто проверить интерфейс и запустить аутентификацию.