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