我正在用cakephp编写一个应用程序,我将拥有管理员和代理,他们可以登录系统。管理员将具有与代理不同的布局。我已经创建了users表,其中我添加了一个角色字段(admin,agent),我在core.php中添加了前缀
Configure::write('Routing.prefixes', array('admin','agent'));
我设法为管理员创建登录和注销,但仍然混淆了我应该如何继续其余的。例如,我不明白beforeFilter()和isAuthorized()函数是如何工作的。我如何检查用户是否有权访问该功能。如果有人尝试访问此页面domain.com/admin以重定向到管理员/登录页面,也可以重定向。
感谢。
答案 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中办理登机手续,但我不想记得在仅编辑一个文件时更改两个文件。