即時做到這一點;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說你需要登錄管理員..
...
那麼你認爲這是一個好辦法做這個 ?或者它是錯誤的山牆意大利麪條* *?
爲什麼它不是很好的做法?爲什麼我會使用一個使用4張表進行簡單認證的重磅圖書?即使我使用了一個;這將取代我的模型,但我的問題是關於核心底座控制器 – Zalaboza
原因是,如果你把身份驗證功能放在MY_Controller中,你認爲你所有將來的控制器都需要auth,這不是一個好的設計,因爲可能在將來你會創建一個沒有授權功能但需要MY_Controller功能的控制器。 –
使用該「重」庫是有用的,因爲您必須使用它編寫0行代碼,並且由用戶搜索錯誤和新功能來維護。 –