我最近扩展了 CWebUser 类,现在它有了这样有用的方法:
Yii::app()->user->isAdmin;
Yii::app()->user->isTeacher;
Yii::app()->user->isStudent;
现在使用 accessControl 过滤器会遇到麻烦。
之前,为了仅允许管理员访问,我使用了:
public function accessRules()
{
return array(
array('allow',
'actions'=>array('index','update', 'create', 'delete'),
'users'=>array('admin'),
),
array('deny',
'users'=>array('*'),
),
);
}
如何重写accessRules以仅为具有Yii :: app() - > user-> isAdmin属性的用户委派访问权限?
答案 0 :(得分:6)
您可以在配置中添加选项'expression'。通常它会获得一个“$ user”作为参数。所以你可以这样做:
array('allow',
'actions'=>array('index','update', 'create', 'delete'),
'expression'=> '$user->isAdmin',
),
请注意,我没有测试过这个,但我认为它会起作用。
看看here其余部分。
答案 1 :(得分:1)
好吧它不会工作,因为它知道Yii :: app() - >用户作为CWebUser实例并且您开发了UserIdentity类,因此它会说'CWebUser及其行为没有名为的方法或闭包“ isAdmin“”!要使用像$ user-> isAdmin这样的表达式你应该设置isAdmin属性抛出setState命令,该命令会使用session来保存通常在身份验证方法中,所以它会是这样的:
class UserIdentity extends CUserIdentity
{
public function authenticate()
{
//your authentication code
//using your functions like $level=$this->isTeacher();
//or $level=$this->isAdmin();
$this->setState('isAdmin',$level);
}
}
现在在accessRules方法的用户控制器中,您可以使用表达式
public function accessRules()
{
return array(
array('allow',
'actions'=>array('action1','action2',...),
'expression'=>'$user->isAdmin',
//or Yii::app()->user->getState('isAdmin'),
),
//...
);
}