Yii 在没有RBAC的情况下通过编程将角色设置为用户?

Yii 在没有RBAC的情况下通过编程将角色设置为用户?,yii,access-rules,Yii,Access Rules,我不使用RBAC来验证用户。如果可能的话,我不介意使用它,但我认为它不是。原因是,我使用RESTAPI来验证用户。我的authenticate()函数中有以下内容: $API = new API(); $user = $API->getAccountDetailsByEmail($this->username); if($user->password !== md5($this->password) ) { // Validated } 我希望在此步骤中也为用户分

我不使用RBAC来验证用户。如果可能的话,我不介意使用它,但我认为它不是。原因是,我使用RESTAPI来验证用户。我的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.
当我进入页面时,我试图让管理员可以访问。如何以编程方式将用户设置为管理员


我是否遗漏了什么,或者是否有一种简单的方法可以将角色分配给经过身份验证的用户?

如果您的操作规则是

array('allow', 
  'actions'=>array(
    'myAction',
  ),
  'users'=>array('@'),
  'roles'=>array('admin'),
),
然后将其更改为:

array('allow', 
  'actions'=>array(
    'myAction',
  ),
  'users'=>array('@'),
  'expression'=>'$user->getState("roles")=="admin"',
),
操作规则的角色参数仅用于RBAC。因此,如果不使用RBAC,则需要以不同的方式进行验证


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

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

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

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

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

如果不包括控制器中的访问规则,则很难帮助您理解这些访问规则阻止您执行操作的原因。