0

我完全不知道如何做到这一点。我有 3 个不同的角色:管理员、员工和捐赠者。我的问题是,如果未经授权的用户尝试从 URL 访问操作,它确实会混淆(无论如何对我来说)权限和适当的重定向。

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

  1. 管理索引
  2. 管理员添加
  3. admin_edit
  4. 管理员视图
  5. 管理员删除

无前缀动作

  1. 登录
  2. 登出
  3. 看法
  4. 添加
  5. 编辑

应该允许管理员访问所有以管理员为前缀的操作以及登录和注销,而工作人员和捐助者应该只能访问后者 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(), works.. 如果在我的捐助者控制器中我想根据角色控制对控制器操作的访问,我该怎么做?例如,如果我的捐助者控制器中有“删除”操作,我将如何允许工作人员用户同时拒绝捐助者用户访问删除操作。我相信 beforeFilter 是解决方案,但找不到怎么做!任何指针?谢谢

4

2 回答 2

1

这可能是您的解决方案。

转到 core.php 文件,如果存在则取消注释/如果不存在则添加以下行。

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

于 2014-02-14T14:40:57.713 回答
1

1)在您的 login() 操作中,检查用户角色,如果角色是管理员,则重定向到任何控制器/操作并设置管理员前缀。如果他不是管理员,则将他重定向到其他内容。

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 。检查测试以获取其工作原理的示例。您只需定义一个嵌套数组结构并将您想要的角色添加到一个操作或整个控制器,或者使用 *.

于 2014-02-14T14:54:44.750 回答