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

时间:2013-08-21 12:30:19

标签: cakephp authentication routing prefix

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

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

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

感谢。

3 个答案:

答案 0 :(得分:0)

使用beforeFilter()来控制对每个操作的访问,下面的示例只允许访问视图和索引操作 - 任何其他操作都将被阻止:

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

如果您想允许访问控制器中的所有操作,请在之前的过滤器中尝试:

$this->Auth->allow();

要控制谁可以访问您可以在app控制器中使用简单功能的内容,如下所示:

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

希望这有帮助。

答案 1 :(得分:0)

我通常做的是将我的App控制器扩展到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内置的授权系统。

答案 2 :(得分:0)

要检查每个角色的津贴,我认为最好在每个控制器的基础上使用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中办理登机手续,但我不想记得在仅编辑一个文件时更改两个文件。