我不使用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.
当我转到页面时,我正在努力使管理员可以访问。如何以编程方式将用户设置为管理员?
我是否遗漏了某些内容,或者是否有一种简单的方法可以为经过身份验证的用户分配角色?
答案 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,则需要以不同方式进行验证。
如果这不是您的问题,请提供有关您正在尝试的内容以及访问规则的详细信息。