yii ACL 适用于不同的用户角色



这个问题可能是基本的,以前问过,但我找不到。我正在使用 Yii,在区分具有操作访问权限的用户时遇到麻烦。我有一个名为tbl_user的表,其中包含用户名,密码和角色等字段。当用户登录时,系统会使用他/她的角色设置 loginAs 状态,例如:

$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"',
        ),
    );
}

编辑

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

来自 http://www.yiiframework.com/doc/guide/1.1/en/topics.auth

访问规则按其顺序逐个评估 指定。与当前模式匹配的第一个规则(例如 用户名、角色、客户端 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',);
}

最新更新