0

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

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

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

谢谢。

4

3 回答 3

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 内置的授权系统。

于 2013-08-21T13:35:20.247 回答
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,但我不想记住在只编辑一个文件时更改两个文件。

于 2013-08-21T20:18:12.480 回答
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');

希望这可以帮助。

于 2013-08-21T12:58:12.857 回答