2013-08-21 121 views
0

Iam使用cakephp編寫應用程序,我將在其中登錄到系統的管理員和座席。管理員將擁有與代理不同的佈局。我已經創造一個我添加了一個角色字段(管理員,代理)的用戶表,我加了前綴在core.php中Cakephp 2.x身份驗證前綴管理員和代理

Configure::write('Routing.prefixes', array('admin','agent')); 

我設法創建登錄和管理的註銷,但仍IAM困惑我應該如何繼續與其餘。例如,我不明白beforeFilter()和isAuthorized()函數是如何工作的。我如何檢查用戶是否有權訪問該功能。此外,如果某人嘗試訪問此網頁的domain.com/admin以將其重定向到管理員/登錄頁面,也可以重定向。

謝謝。

回答

0

使用beforeFilter()來控制訪問每個動作,下面的例子將只允許訪問視圖和索引行動 - 任何其他的操作將被阻止:

$this->Auth->allow('view', 'index'); 

,如果你要允許訪問在你的控制器中的所有動作,試試這個在您的面前過濾器:

$this->Auth->allow(); 

要控制誰訪問了什麼,你可以在你的應用程序控制器使用一個簡單的功能,像這樣:

protected function _isAuthorized($role_required) { 
      if ($this->Auth->user('role') != $role_required) { 
       $this->Session->setFlash("your message here..."); 
       $this->redirect("wherever you want the user to go to..."); 
      } 
    } 

在您的控制器操作中,例如,在第一行admin_delete你會做到以下幾點:

$this->_isAuthorized('admin'); 

最後重定向的工作原理是這樣:

$this->redirect(array('controller' => 'home', 'action' => 'dashboard')); 

如果你是在同一個控制器內重定向只需做到以下幾點:

$this->redirect('dashboard'); 

希望這有助於。

+0

嗨,感謝您的回答,我認爲它現在非常清楚。沒有更好的方法來檢查用戶是否有權限而不是檢查每個操作的權限嗎? – zihatzik

+0

很酷沒問題,看下面的代碼: – KevinCoder

0

我最常做的是我的應用程序控制器擴展到AdminAppController和SiteController,在AdminAppController我在beforeFilter下面的代碼:

$controller = strtolower($this->params["controller"]); 
$action = strtolower($this->params["action"]); 
$crole = $this->Auth->user("role"); 
$allowed = false; 
$roles = array(

    "all"=>array("user#login","user#register","user#forgot"), 
    "admin"=>array("pages#index","pages#view") 
); 

if(in_array($controller."#".$action,$roles["all"])){ 

$allowed = true; 
}else{ 

    if(in_array($controller."#".$action,$roles[$crole])){ 
     $allowed = true; 
    } 



} 


if($allowed==false){ 
$this->setFlash("Access denied message..."); 
$this->redirect("..."); 
} 

不知道這是不是最好的做法,但它工作得很好。我通常討厭CakePHP內置的授權系統。

0

要檢查每個角色的配額,我認爲最好在每個控制器的基礎上使用Auth-> allow([...])。

我發現最好在控制器:: beforeFilter(檢查)有:

switch ($role) { 
    case 'admin': 
    $this->Auth->allow(...); //Allow delete 
    //notice no break; statement, so next case will execute too if admin 
    case 'manager': 
    $this->Auth->allow(...); //Allow edit 
    case default: 
    $this->Auth->allow(...); //Allow index 
} 

雖然你可以在AppController的檢查,我不想記得要改變兩個文件,當我編輯只有一個。