没有RBAC以编程方式将角色设置为用户?

时间:2012-11-25 11:27:47

标签: yii access-rules

我不使用RBAC来验证用户。如果可能,我不介意使用它,但我认为不是。原因是,我使用REST API来验证用户。我在authenticate()函数中有这个:

$API = new API();
$user = $API->getAccountDetailsByEmail($this->username);
if($user->password !== md5($this->password) ) {
   // Validated
}

我希望在此步骤中也为用户分配角色。这就是我在上面尝试以下内容的原因:

$this->setState('roles', 'admin'); 

但这根本不起作用。我还是得到了:

Error 403: You are not authorized to perform this action.

当我转到页面时,我正在努力使管理员可以访问。如何以编程方式将用户设置为管理员?

我是否遗漏了某些内容,或者是否有一种简单的方法可以为经过身份验证的用户分配角色?

2 个答案:

答案 0 :(得分:1)

CAccessControlFilter依赖于CWebUser :: checkAccess()函数。使用角色的名称作为参数调用此函数。如果您不想要RBAC,那么您最简单的方法就是编写自己的CWebUser派生类并实现自己的checkAccess。

您可以通过添加“user”组件在配置文件中激活此类:

'components'=> array
(
    'user' => array
    (
        'class' => 'MyWebUser',
    ),
),

例如,您可以在用户会话中设置角色列表,并让函数检查用户是否具有该角色。虽然我建议不要使用会话来存储角色(数据库是更好的)使用setState绝对是一个坏主意。 IIRC在用户端设置了一个cookie,一些有创造力的用户可以弄清楚如何滥用它。

答案 1 :(得分:0)

如果您的行动规则是

array('allow', 
  'actions'=>array(
    'myAction',
  ),
  'users'=>array('@'),
  'roles'=>array('admin'),
),

然后将其更改为:

array('allow', 
  'actions'=>array(
    'myAction',
  ),
  'users'=>array('@'),
  'expression'=>'$user->getState("roles")=="admin"',
),

操作规则的角色参数仅供RBAC使用。因此,如果您不使用RBAC,则需要以不同方式进行验证。

如果这不是您的问题,请提供有关您正在尝试的内容以及访问规则的详细信息。