在Yii Framework中实现基于角色的授权

时间:2012-06-09 03:43:13

标签: php yii

我一直在关注这个教程,这很棒,并且有一个问题。

http://www.larryullman.com/2010/01/07/custom-authentication-using-the-yii-framework/

我可以在我的应用程序代码中的任何位置访问角色属性:

Yii::app()->user->role

但是,我真正想做的是使用我的UserController中的默认控制器授权:

/**
  * Specifies the access control rules.
  * This method is used by the 'accessControl' filter.
  * @return array access control rules
  */
public function accessRules()
{  
  return array(
   array('allow',  // allow all users to perform 'index' and 'view' actions
    'actions'=>array('*'),
    'users'=>array('@'),
    // Fails
    'roles'=>array(ModelConstantsRole::ADMIN),
    // Also Fails
    'expression'=>'(isset(Yii::app()->user->role) && (Yii::app()->user->role==ModelConstantsRole::ADMIN))',
   ),
   array('deny',  // deny all users
    'users'=>array('*'),
   ),
  );
}

实际验证accessRules中定义的规则的类似乎并不真正了解我已分配给它的角色。 CAccessControlFilter(适合那些不想在40分钟内搜索XD的人)。

当我将其与Larry的方法结合使用时,有关如何使用accessRules方法的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:5)

从您的代码中看起来您希望将此规则应用于所有操作,为此您需要将actions数组保留为未指定或空数组:

//empty actions
array('allow',  
'actions'=>array(),//array('*'),
...
)

或未指明:

array('allow',  // allow all users to perform 'index' and 'view' actions
//'actions'=>array('*'),
...
)

这已经是documented in the docs

  

阵列(     '允许',//或'拒绝'     //可选,此规则适用于的操作ID列表(不区分大小写)     //如果未指定,则规则适用于所有操作
    'actions'=>数组('edit','delete'),

请记住,roles数组又是一个带有角色名称的数组,例如:

'roles'=>array('role1','role2','role3')

然后你不需要'表达式',因为你在那里做的所有事情都已经完成了角色数组。

编辑:在阅读了您已链接的教程后,似乎他没有实现RBAC'roles'选项使用rbac,因此没有它就无法工作。因此,您必须使用'expression'选项,而您的'expression'选项看起来不错。

答案 1 :(得分:0)

尝试正确设置动作

array('allow',  // allow all users to perform 'index' and 'view' actions
    'actions'=>array('view', 'delete', 'update'),