2014-01-30 74 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構造函數;所以我應該檢索$ action_user對象;或者已經嘗試登錄他

,如果我想限制一個頁面,我只是添加

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

給它的構造,如果不允許用戶頁面會死,我向他視圖頁而不重定向。

使用這種方法的原因是讓用戶能夠從任何控制器登錄,註銷; 如果他訪問http://localhost/RANDOMECONTROLLER/logout他仍然會註銷..登錄也一樣。

它的幫助,有時當我得到頁面partials by ajax;它只會以登錄表單將登陸頁面返回到這個div。

例如

一個統計頁面有4只小部件,它們中的1僅是可見的由管理員; 那麼當AJAX惠譽4級的小部件,它會顯示3與登錄表單的DIV說你需要登錄管理員..

...

那麼你認爲這是一個好辦法做這個 ?或者它是錯誤的山牆意大利麪條* *?

回答

0

這不是一個好習慣。最佳做法是創建一個擴展MY_Controller的Secure_Controller。如果你有一個帶有認證的控制器,你需要擴展Secure_Controller,但是如果你有另一個沒有認證的話,你需要擴展MY_Controller。

有很多codeigniter auth的庫可以很容易地擴展和適應您的要求,例如Ion Auth

+0

爲什麼它不是很好的做法?爲什麼我會使用一個使用4張表進行簡單認證的重磅圖書?即使我使用了一個;這將取代我的模型,但我的問題是關於核心底座控制器 – Zalaboza

+0

原因是,如果你把身份驗證功能放在MY_Controller中,你認爲你所有將來的控制器都需要auth,這不是一個好的設計,因爲可能在將來你會創建一個沒有授權功能但需要MY_Controller功能的控制器。 –

+0

使用該「重」庫是有用的,因爲您必須使用它編寫0行代碼,並且由用戶搜索錯誤和新功能來維護。 –

相關問題