2011-01-07 105 views
2

我最近扩展CWebUser类,现在它有这样有用的方法:扩展CWebUser和重写的Yii AccessControl的

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 ::应用访问() - >用户> isAdmin属性?

回答

6

您可以向配置添加选项“表达式”。通常它会得到一个“$ user”作为参数。所以你可以这样做:

array('allow', 
    'actions'=>array('index','update', 'create', 'delete'), 
    'expression'=> '$user->isAdmin', 
), 

请注意,我没有测试过这个,但我认为它会工作。

其他的请看看here

+2

'expression'=> Yii :: app() - > user-> isAdmin || Yii :: app() - > user-> isTeacher等也适用我认为 – ZaQ 2011-01-07 12:42:04

1

它不会工作,因为它知道Yii :: app() - >用户为CWebUser实例,并且您开发了UserIdentity类,因此它会说'CWebUser及其行为没有名为方法或闭包“ isAdmin“”!要使用像$用户> isAdmin表达您应该设置isAdmin财产扔它将使用session来保存,通常在身份验证方法的setState命令所以它会是这样的:

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'), 
     ), 
     //... 
    ); 
}