2011-01-07 103 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'), 
     ), 
     //... 
    ); 
}