我正在用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,但当我只编辑一个文件时,我不想记住更改两个文件。