繁体   English   中英

cakePHP-角色授权和路由

[英]cakePHP- Role Authorization and Routing

我完全和完全失去了如何做到这一点。 我有3个不同的角色:管理员,员工和捐助者。 我的问题是,如果未经授权的用户试图从URL访问操作,那么对于权限以及适当的重定向,它确实会让我感到困惑(对我而言)。

在我的UsersController中,我有以下操作

  1. admin_index
  2. admin_add
  3. admin_edit
  4. admin_view
  5. admin_delete

非前缀动作

  1. 登录
  2. 登出
  3. 视图
  4. 编辑

应该允许管理员访问所有以管理员为前缀的操作以及登录和注销,而员工和捐赠者应该只能访问后者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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM