2014-01-30 2 views
0

им это делать;Codeigniter: использовать auth в базовом контроллере, это хорошая практика?

пример ядро ​​/ 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; поэтому я должен hv получить объект $ action_user; или уже пытался войти с ним в

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

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

в конструктор, и если пользователь не имеет права страницы умрёт и послать ему мою страницу просмотра без редиректа.

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

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

пример

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

...

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

ответ

0

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

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

+0

любая причина, по которой это не очень хорошая практика? и зачем мне использовать тяжелую библиотеку, которая использует 4 таблицы для простого аутентификации? и даже если я его использовал; это заменит мою модель, но мой вопрос касается основного базового контроллера. – Zalaboza

+0

Причина в том, что если вы добавите функции auth в MY_Controller, вы предполагаете, что всем вашим будущим контроллерам понадобится auth, и это не очень хороший дизайн, потому что, возможно, в будущем вы будете создайте контроллер без функции auth, но вам потребуется функция MY_Controller. –

+0

Это использование этой «тяжелой» библиотеки, потому что вы должны написать 0 строк кода, используя ее, и потому, что она поддерживается пользователями, которые ищут ошибки и новые функции. –

Смежные вопросы