[英]cakePHP- Role Authorization and Routing
我完全和完全失去了如何做到这一点。 我有3个不同的角色:管理员,员工和捐助者。 我的问题是,如果未经授权的用户试图从URL访问操作,那么对于权限以及适当的重定向,它确实会让我感到困惑(对我而言)。
在我的UsersController中,我有以下操作
非前缀动作
应该允许管理员访问所有以管理员为前缀的操作以及登录和注销,而员工和捐赠者应该只能访问后者5.还要注意所有用户都使用相同的登录表单。
在我的AppControlles的组件中,我有以下内容:
'Auth' => array(
'loginRedirect' => array(
'controller' => 'donors',
'action' => 'index'
),
'logoutRedirect' => array(
'controller' => 'users',
'action' => 'login'
),
'authorize' => array('Controller')
)
但是,在我的登录操作中,我检查用户角色以相应地更改loginRedirect:
if($this->request->is('post')){
if($this->Auth->login()){
switch($this->Auth->user('role')){
case 'admin':
$this->Auth->loginRedirect = array('controller'=>'users','action'=>'admin_index','prefix'=>'admin','admin'=>true);
break;
case 'donor':
...
break;
case .....
}
}
}
问题1现在,如果当前具有捐赠者角色的用户登录并尝试访问localhost/sitename/admin/users/add
,则会将其重定向到admin/donors
而不是/donors
。 那我怎么能删除管理员前缀?
问题2另外我还不完全理解hwo $ this-> Auth-> allow(),有效。如果在我的donorController中我想根据角色控制对控制器动作的访问,我该怎么办呢? 例如,如果我的donorController中有“删除”操作,我将如何允许工作人员用户同时拒绝捐赠者用户访问删除操作。 我相信beforeFilter是解决方案,但找不到怎么做! 有什么指针吗? 谢谢
这可能是您的解决方案。
转到core.php文件并取消注释if present / add如果不存在以下行。
Configure::write('Routing.prefixes', array('admin'));
Location: app/config/core.php
将下面的代码放在AppController.php(cake version 2.X)/ app_controller.php(cake version <2.X)的beforeFilter方法中
function beforeFilter(){
if($this->Auth->user('role') == 'admin'){
if(!in_array($this->params['action'],array('login','logout')) && (stristr($this->params['action'], 'admin_') === FALSE)){
$this->redirect(array("controller"=>$this->params['controller'],"action"=>'admin_'.$this->params['action'],"admin" => 1));
}
}else{
if(stristr($this->params['action'], 'admin_')){
$action = explode('_',$this->params['action']);
$this->redirect(array("controller"=>$this->params['controller'],"action"=>$action[1],"admin" => false));
}
}
}
您可以通过处理自定义错误页面来管理其余功能。
您可以参考自定义错误pae
1)在您的login()操作中,检查用户角色,如果角色是admin重定向到任何控制器/操作并设置管理员前缀。 如果他不是管理员将他重定向到别的东西。
if ($this->Auth->login()) {
if ($this->Auth->user('role') === 'admin') {
$this->redirect(array(
'admin' => true,
'controller' => 'foo',
'action' => 'bar')));
} else {
// Do something else, another redirect or whatever
}
}
无需从URL中删除/ admin,因为它应该在尝试访问不允许的URL时向用户显示未授权的用户。
2)如果要授予不同角色的访问权限,可以使用我编写的SimpleRbacAuth 。 检查测试以获取其工作原理的示例 。 您只需定义嵌套数组结构并将所需的角色添加到操作或整个控制器,或使用*授予对每个人的访问权限。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.