这个问题可能是基本的,之前已被问过,但我找不到。 我正在使用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。 管理员应该能够访问除“删除”之外的所有内容。还有另一种方法吗?任何帮助将不胜感激。
答案 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',);
}