2014-02-14 99 views
0

我完全彻底失去了如何做到这一点。我有3个不同的角色:管理员,员工和捐助者。我的问题是,如果未经授权的用户尝试访问来自URL的操作,那么它确实会让人感到困惑(对我来说),并具有权限以及适当的重定向。cakePHP-角色授权和路由

在我UsersController我有下列行为

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

不带前缀的行动

  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 此外,我不完全理解藿$这个 - > Auth->允许()的作品。如果在我donorsController我想控制访问根据角色控制器动作,我该怎么办它?例如,如果在我的donorsController中有'删除'操作,我将如何允许员工用户同时拒绝授权用户访问删除操作。我相信beforeFilter是解决方案,但无法找到如何去做!任何指针? 谢谢

+1

你应该总是提到你正在使用的确切cakephp版本。提示:不要在这里创建巨大的控制器代码开销,而应该使用简单的/登录表单和[Tiny](http://www.dereuromark.de/2011/12/18/tinyauth-the-fastest-和-easy-authorization-for-cake2 /)作为Auth方法。通过这种方式,每个动作都被明确定义,并且在没有访问权限的情况下,所有动作都将重定向到/登录为中央登录表单。 – mark

+0

感谢您的答复!我浏览了你的博客,看起来很干净。但是我没有这个设置,因为这些角色在用户的表中被定义为一个字段,而不是一个模型。此外,我仍然有理解$ this-> Auth-allow()的工作原理,以及我希望能够使用我已有的设置来恢复的问题。谢谢! – LogixMaster

+1

只是用户表字段的作品,以及。阅读文档。不一定是模特。 – mark

回答

1

1)在你的登录()动作用于教学贯彻用户角色检查,如果角色是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作为它应该显示未授权用户HES当他试图访问,他是不允许的URL。

2)如果你想授予不同角色的访问权限,你可以使用我写的SimpleRbacAuth。它如何工作的Check the tests for examples。您只需定义一个嵌套数组结构并将您想要的角色添加到动作或整个控制器中,或者使用*为每个人授予访问权限。

+0

我一定会检查你的rbac代码!然而,检查登录操作中的角色是我已经在做的事情(因此对这个问题不太有帮助,但可能对访问者有帮助)! – LogixMaster

1

这可能是一个解决方案。

转到core.php文件并取消注释如果存在/添加如果不存在下面的行。

Configure::write('Routing.prefixes', array('admin')); 
Location: app/config/core.php 

把下面的代码AppController.php(饼版本2.X)/ app_controller.php(饼版本< 2的beforeFilter方法内。X)

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

+0

这是不必要的复杂。请求中有'前缀',不需要解析前缀的操作,登录和注销操作可以由Auth组件设置来定义。 – burzum

+0

谢谢!这可能不完全是我想要的,因为它只是从URL中删除管理员前缀,这是我在我的问题中要求的。因此,将其标记为“已回答”,因为我实际上认为我可以使用这个功能!还为+1高亮定制错误页面! – LogixMaster

+0

@burzum你能不能详细解释一下这件事,为什么这很复杂,或者如果有更好的方法去做呢?谢谢 – LogixMaster