#php #codeigniter #inheritance #login #privileges
#php #codeigniter #наследование #аутентификация #привилегии
Вопрос:
Я хочу выполнить вход в систему с помощью моего проекта codeigniter.
Некоторые соображения:
1) Есть два внешних контроллера, которые не требуют аутентификации. Один для информации (splash_pages и тому подобное), а другой для создания зарегистрированного сеанса.
2) Все остальные контроллеры наследуются от главного контроллера, который, как часть его конструктора, требует, чтобы вы вошли в систему, или он выводит вас на экран входа в систему.
До сих пор приведенные выше 2 отлично работают для входа в систему и выхода из системы.
С точки зрения кода:
Главный контроллер, который я описывал для 2), находится в основной папке Codeigniter
class MY_Controller extends CI_Controller
{
public function __construct()
{
parent::__construct();
$this->load->library('cart');
$this->load->library('session');
$this->load->helper('form');
$this->load->library('form_validation');
if (!$this->session->userdata('loggedin')){
redirect('/sessions/log_in/','refresh');
}
}
Класс, использующий систему входа в систему:
class Records extends MY_Controller {
public function __construct()
{
parent::__construct();
$this->load->model('some_model');
$this->load->library('some_library');
}
Идея заключается в том, что при построении объекта он проверяет, вошел ли пользователь в систему или нет, и либо правильно создает объект, либо перенаправляет на экран входа в систему.
Однако потребности проекта немного изменились. В требованиях теперь указано, что существует около 6 различных групп пользователей, чьи привилегии могут быть разделены на подмножества. A может выполнять I, B может выполнять A II, C может выполнять B III и так далее. Были небольшие намеки на то, что могут быть привилегии, которые не являются строго подмножеством (Т. Е. Только B может выполнять задачу IV), но это еще не подтверждено, поэтому я хочу оставить свои параметры открытыми.
Я предполагаю, что у меня есть куча контроллеров от MY_Controller, которые наследуются от MY_Controller.
Например, в основной папке:
class MY_AsController extends MY_Controller {
public function __construct(){
parent::__construct();
$accountType = $this->session->userdata('accountType');
if(!($accountType == declaredConstant)){
redirect('/someController/someMethod','refresh');
}
}
Затем в папке controllers:
class AControlPage extends MY_AsController {
//Insert page functions that only As have access to here
}
К сожалению, его применение на практике не приводит к возникновению каких-либо ошибок, только пустая страница.
Я не уверен, что делать после этого.
Комментарии:
1. Что такое
$declaredConstant
и почему это двойные круглые скобки?2. в начале моего файла: require_once(dirname( FILE ).»/constants.php «); Это константа с объявленным там ее определением. Извините, я забыл, что константы не нуждаются в $. Он эффективно сопоставляется со значением DB, таким как 1,2,3,…
3. Почему ваши контроллеры не всегда расширяются
MY_Controller
и не передают$accountType
требование в качестве параметра конструктору?4. Я понимаю, к чему вы клоните! К сожалению, я не могу вызвать метод $this-> load-> library(‘session’) (и, следовательно: $this-> session-> userdata(‘AccountType’)) до завершения родительского конструктора (load — это унаследованный метод от CI_Controller). У меня есть еще одна идея попробовать. Вскоре последует.
Ответ №1:
В итоге родительский конструктор не изменился и вообще не использовал больше наследования:
В MY_Controller добавлено следующее:
public function allowedToView($userAccountType, $requiredAccountTypes){
//If user not in allowed userGroup
if(!(in_array($userAccountType,$requiredAccountTypes))){
redirect('/sessions/not_allowed/','refresh');
}
}
Изменен дочерний конструктор на:
public function __construct() {
parent::__construct();
$accountType = $this->session->userdata('accountType');
$allowedTypes = array(declaredConstant1,declaredConstant2,...);
$this->allowedToView($accountType,$allowedTypes);
}
Спасибо, Джозеф, за понимание, уводящее меня от моего сумасшествия!