我完全失去了如何做到这一点。我有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是解决方案,但找不到怎么做!有什么指针吗? 感谢
答案 0 :(得分:1)
这可能是您的解决方案。
转到core.php文件,如果不存在,则取消注释if / 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));
}
}
}
您可以通过处理自定义错误页面来管理其他功能。
您可以参考Customize error pae
答案 1 :(得分:1)
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。 Check the tests for examples它是如何运作的。您只需定义嵌套数组结构并将所需角色添加到操作或整个控制器,或使用*授予每个人访问权限。