【问题标题】:yii ACL for different user rolesyii ACL 用于不同的用户角色
【发布时间】:2013-12-25 16:16:56
【问题描述】:

这个问题可能是基本的,以前有人问过,但我找不到。 我正在使用 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"',
        ),
    );
}

已编辑

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

【问题讨论】:

  • echo Yii::app()->user->getState("loginAs");并检查值。

标签: yii acl


【解决方案1】:

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

【讨论】:

  • 但是根据你的代码,不是说Administrator也可以访问actionDelete吗?管理员应该无法访问它。
  • 对不起,我的问题可能不够清楚,我已经编辑过了。
  • 我已经更新了答案。您应该查看链接以获取更多信息。
  • 感谢topher,它有效。注意到该链接,将对其进行更多研究。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2018-02-09
    • 1970-01-01
    • 2015-02-06
    相关资源
    最近更新 更多