不同用户角色的yii ACL

不同用户角色的yii ACL,yii,acl,Yii,Acl,这个问题可能是基本的,以前也有人问过,但我找不到。 我使用的是Yii,在区分使用action访问的用户时遇到了麻烦。 我有一个名为tbl_user的表,其中包含用户名、密码和角色等字段。用户登录时,系统将根据其角色设置登录状态,例如: $role = "Super User"; //assume we get this role by querying the tbl_user Yii::app()->user->setState("loginAs", $role) 在控制器中,有

这个问题可能是基本的,以前也有人问过,但我找不到。 我使用的是Yii,在区分使用action访问的用户时遇到了麻烦。 我有一个名为tbl_user的表,其中包含用户名、密码和角色等字段。用户登录时,系统将根据其角色设置登录状态,例如:

$role = "Super User"; //assume we get this role by querying the tbl_user
Yii::app()->user->setState("loginAs", $role)
在控制器中,有4个操作,actionIndex、actionCreate、actionUpdate和actionDelete。如果超级用户登录,这4个操作将可用。但是,如果另一个用户具有不同的角色登录,例如管理员,则除了actionDelete之外,其他所有用户都将可用。我试过这个:

public function accessRules()
{
    return array(
        array('allow',
            'actions'=>array('index','create','update','delete'),
            'expression'=>'Yii::app()->user->getState("loginAs")=="Super User"'
        ),
        array('allow',
            'actions'=>array('index','create','update'),
            'expression'=>'Yii::app()->user->getState("loginAs")=="Administrator"',
        ),
    );
}
编辑

上面的代码不起作用。当我以管理员身份登录时,所有4个操作都会出现错误403。管理员应该能够访问除“删除”之外的所有内容。还有别的办法吗?任何帮助都将不胜感激。

来自

按照访问规则的顺序逐个评估访问规则 明确规定。与当前模式匹配的第一条规则,例如。 用户名、角色、客户端IP、地址决定授权 后果如果该规则是允许规则,则可以执行该操作;如果 这是一个拒绝规则,无法执行该操作;如果没有任何规则 如果与上下文匹配,则仍然可以执行该操作

因此,您应该将可以在单个表达式中执行操作的所有角色组合在一起,即

    array('allow',
        'actions'=>array('index','create','update'),
        'expression'=>'in_array(Yii::app()->user->getState("loginAs"),array("Super User","Administrator",...))'
    ),

    array('allow',
        'actions'=>array('delete'),
        'expression'=>'Yii::app()->user->getState("loginAs")=="Super User"'
    ),
另外,如果您遵循上面的链接,您将看到如何在Yii中实现RBAC。这可以将您的代码简化为

    array('allow',
        'actions'=>array('index','create','update'),
        'roles'=>array("Super User","Administrator"),
    ),
还要确保在控制器筛选器中启用了accessControl

public function filters()
{ 
    // ...
    return array('accessControl',);
}

echo Yii::app->user->getStateloginAs;然后检查值。但根据您的代码,这不意味着管理员也可以访问actionDelete吗?管理员应该无法访问它。抱歉,也许我的问题不够清楚,我已编辑了它。我已更新了答案。您应该查看链接以了解更多信息。谢谢托弗,它很有效。注意到了链接,我们将进一步研究它。