Cakephp2.x身份验证前缀管理员和代理



我正在用cakephp编写一个应用程序,在那里我将有管理员和代理,他们可以登录到系统。管理员将具有与代理不同的布局。我已经创建了users表,在其中我添加了一个角色字段(admin,agent),我在core.php 中添加了前缀

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

我设法为管理员创建了登录和注销,但我仍然不知道如何处理其余的。例如,我不明白beforeFilter()和isAuthorized()函数是如何工作的。如何检查用户是否可以访问该功能。还有重定向,如果有人试图访问此页面domain.com/admin,则重定向到admin/login页面。

谢谢。

使用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');

希望这能有所帮助。

我通常要做的是将我的应用程序控制器扩展为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的内置授权系统。

要检查每个角色的权限,我认为最好在每个控制器的基础上使用Auth->allow([…])。

我发现最好使用检查Controller::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,但当我只编辑一个文件时,我不想记住更改两个文件。

最新更新