2013-08-21 96 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的检查,我不想记得要改变两个文件,当我编辑只有一个。