Codeigniter: управление правами входа с наследованием

#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);
}
  

Спасибо, Джозеф, за понимание, уводящее меня от моего сумасшествия!