0

我不使用 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.

当我转到该页面时,我试图让管理员可以访问。如何以编程方式将用户设置为管理员?

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

4

2 回答 2

1

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

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

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

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

于 2012-11-26T08:56:05.400 回答
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,则需要以不同的方式进行验证。

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

于 2012-11-25T18:28:13.783 回答