yii用于不同用户角色的ACL

时间:2013-12-25 16:16:56

标签: 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个操作。但是,如果具有不同角色登录的其他用户(例如“administrator”),则除了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"',
        ),
    );
}

EDITED

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

2 个答案:

答案 0 :(得分:0)

来自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"),
    ),

答案 1 :(得分:0)

还要确保您的控制器过滤器中已启用accessControl

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