cakePHP-角色授权和路由

时间:2014-02-14 13:13:56

标签: php cakephp cakephp-2.0 cakephp-routing

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

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

  1. admin_index
  2. admin_add
  3. admin_edit
  4. admin_view
  5. admin_delete
  6. 无前缀的操作

    1. 登录
    2. 注销
    3. 视图
    4. 添加
    5. 修改
    6. 应该允许管理员访问所有以管理员为前缀的操作以及登录和注销,而员工和捐赠者 应该只能访问后者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是解决方案,但找不到怎么做!有什么指针吗? 感谢

2 个答案:

答案 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)如果您想授予不同角色的访问权限,可以使用我写的SimpleRbacAuthCheck the tests for examples它是如何运作的。您只需定义嵌套数组结构并将所需角色添加到操作或整个控制器,或使用*授予每个人访问权限。