扩展CWebUser并重写Yii accessControl

时间:2011-01-07 07:38:21

标签: php yii

我最近扩展了 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属性的用户委派访问权限?

2 个答案:

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