3

我一直在关注本教程,顺便说一句,这很棒,并且有一个问题。

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)。

当我将 accessRules 方法与 Larry 的方法结合使用时,我有什么想法吗?

谢谢!

4

2 回答 2

5

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

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

或未指定:

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

这已经记录在文档中

array( 'allow', // 或 'deny'
// 可选,此规则适用的操作 ID 列表(不区分大小写)
// 如果未指定,则规则适用于所有操作
'actions'=>array('edit' , '删除'),

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

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

然后你就不需要“表达式”了,因为你在那里所做的一切都已经用角色数组完成了。

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

于 2012-06-10T16:25:27.313 回答
0

尝试正确设置动作

array('allow',  // allow all users to perform 'index' and 'view' actions
    'actions'=>array('view', 'delete', 'update'),
于 2012-06-09T12:34:19.630 回答