Codeigniter: использовать аутентификацию в базовом контроллере, это хорошая практика?

я делаю это;

пример ядра/MY_CONTROLLER.php

private $action_user=null;
public function __construct()
{
    parent::__construct();

    ##listen for post attempts;
    $this->validate();

    ##set action_user; return null if no session else return user object
    $this->action_user = $this->session->userdata('loged_user');

    ##extra check step
    if($this->user->pwd_has_changed($this->action_user)){
            $this->session->sess_destroy();
            alerts('error','the password you used to login has changed ! please relogin');
            return $this->failed_login();
    }
}

public function alerts(){return die(json_encode(alerts()));}#a helper function.. just ignore it for this example
public function logout(){$this->session->sess_destroy();redirect();}


#AUTH
private function failed_login(){
    //$callers=debug_backtrace();

    alerts('warning','failed login');//.' '.$callers[1]['function']);
    ob_clean();//clear flush just to make sure !

    if($this->input->is_ajax_request())$this->load->view('base/ajax/landing');
    else $this->load->view('base/landing');

    die($this->output->get_output());//kill request and load landing in same uri. this in case he attempt login again he will be at same url; also helps with partials views
}
private function success_login(){
    unset($_POST['login'],$_POST['password']);
    alerts('success','welcome '.$this->action_user->login);
    //nothin much to do.. just dont die
}
private function validate(){
    //listen to posts if so logout and relog in
    if( !$this->input->post('login') || !$this->input->post('password'))return FALSE;
    $this->session->sess_destroy();#destroy session
    #1. validation
    $this->form_validation->set_rules('login', 'User Login', 'required|min_length[4]|max_length[12]|xss_clean');
    $this->form_validation->set_rules('password', 'Password', 'required|min_length[4]|max_length[12]|xss_clean');

    #1.2 Failed validation
    if( ! $this->form_validation->run() )return alerts('error',$this->form_validation->error_string(),false);#set message and return false

    #2. Login
    $this->user->login(set_value('login'),set_value('password'));
    //i dont want it to return anything ! $this->user->login should set messages of success OR fail + set user session
}
public function auth($role = null){
    if(!isset($this->action_user->id))
        return alerts('error',"this is a users restricted area",$this->failed_login());

    //ACCESS LEVELS CONDITIONS
    if($this->user->in_group($this->action_user->id,$role))return $this->success_login();

    return alerts('error',"this is a {$role} restricted area",$this->failed_login());
}
#END AUTH

теперь в моем конструкторе контроллера; так как сначала вызывается конструктор MY_CONTROLLER; поэтому я должен получить объект $action_user; или уже пытались войти в систему.

если я хочу ограничить страницу, я просто добавляю

$this->auth();
//or $this->auth('admin');

в его конструктор, и если пользователю не разрешено, страница умрет и отправит ему мою страницу просмотра без перенаправления;

причина, по которой я использую такой подход, заключается в том, чтобы пользователь мог входить в систему, выходить из системы с любого контроллера; если он посетит http://localhost/RANDOMECONTROLLER/logout, он все равно выйдет из системы.. то же самое для входа в систему.

также полезно, что иногда, когда я получаю частичные страницы с помощью ajax; он просто вернет целевую страницу в этот div с формой входа.

пример

на странице статистики есть 4 виджета, 1 из них доступен для просмотра только администратору; затем, когда ajax fitch 4 виджета, он покажет 3 и div с формой входа в систему, в которой говорится, что для входа в систему вам нужно быть администратором.

...

так вы думаете, что это хороший способ сделать это? или это баг гейбл спагетти ** ?


person Zalaboza    schedule 30.01.2014    source источник


Ответы (1)


Это не очень хорошая практика. Лучшей практикой является создание Secure_Controller, который расширяет MY_Controller. Если у вас есть контроллер с авторизацией, вам нужно расширить Secure_Controller, но если у вас есть другой контроллер без аутентификации, вам нужно расширить MY_Controller.

Существует множество библиотек для аутентификации codeigniter, которые легко расширить и адаптировать к вашим требованиям, например Ion Auth.

person Manuel Bécares    schedule 30.01.2014
comment
любая причина, почему это не хорошая практика? и зачем мне использовать тяжелую библиотеку, которая использует 4 таблицы для простой аутентификации? и даже если бы я использовал один; это заменит мою модель, но мой вопрос касается основного базового контроллера - person Zalaboza; 30.01.2014
comment
Причина в том, что если вы поместите функциональность аутентификации в MY_Controller, вы предполагаете, что всем вашим будущим контроллерам потребуется аутентификация, и это не очень хороший дизайн, потому что, вероятно, в будущем вы создадите контроллер без функциональности аутентификации, но нуждающийся в функциональности MY_Controller. - person Manuel Bécares; 30.01.2014
comment
Эту тяжелую библиотеку полезно использовать, потому что вам нужно написать 0 строк кода, используя ее, и потому что она поддерживается пользователями, которые ищут ошибки и новые функции. - person Manuel Bécares; 30.01.2014
comment
Хорошей практикой является создание классов с определенными ролями, например, класс для управления аутентификацией, класс для доступа к базе данных... Аутентификация должна управляться классом или контроллером, специально созданным для этой задачи. - person Manuel Bécares; 30.01.2014
comment
я согласен со всем этим; и поэтому у меня есть $this->user для авторизации; и для страницы, требующей аутентификации, я должен включить команду $this->auth(); в конструктор, как я уже упоминал, но это хороший момент в отношении поддерживаемой библиотеки. - person Zalaboza; 30.01.2014
comment
Значит, MY_Controller обрабатывает только авторизацию? Я думал, что MY_Controller будет иметь больше функциональности. - person Manuel Bécares; 30.01.2014
comment
github.com/alzalabany/codeigniter-base-controller; до сих пор он обрабатывает запросы на авторизацию, генерацию шаблонов и управление активами. - person Zalaboza; 30.01.2014