Yii简单的用户授权系统

jerry Yii 2015年11月23日 收藏

数据库

首先在user表创建一个新的字段(integer 类型),字段名 'accessLevel',它定义了用户的访问权限

扩展 CWebUser 类

在配置文件(一般为 protected/config/main.php)中添加(或修改为)以下代码

'components'=>array(
    'user'=>array(
        //告诉应用程序使用自己的 WebUser 类,而不是默认的 CWebUser
        'class'=>'WebUser',
        //...
    ),
),

在组件文件夹(protected/components)中,创建WebUser.php文件,内容为

class WebUser extends CWebUser {
    private $_user;

    //是用户还是超级管理员?
    function getIsSuperAdmin() {
        return ($this->user && $this->user->accessLevel === User::LEVEL_SUPERADMIN);
    }

    //该用户是否为管理员?
    function getIsAdmin() {
        return ($this->user && $this->user->accessLevel >= User::LEVEL_ADMIN);
    }

    //获取登录用户
    function getUser() {
        if ($this->isGuest)
            return;
        if ($this->_user === null) {
            $this->_user = User::model()->findByPk($this->id);
        }
        return $this->_user;
    }
}

用法

现在可以在 accessControl 过滤器(filter) 中来验证用户了

//在控制器中
function accessRules() {
    return array(
        //只有管理员可以访问
        array('allow',
            'expression' => '$user->isAdmin',
            //变量 `user` 在访问规则(accessRule)表达式中表示的是 Yii::app()->user
        ),
        //deny all other users
        array('deny',
            'users' => array('*') .
    ),
    );
}

在视图中使用

if (Yii::app()->user->isAdmin) {
    echo '欢迎,管理员!';
}
if (Yii::app()->user->isSuperAdmin) {
    echo '你是超级管理员!';
}

数据表示

在用户名模型中(User Model),整型的那个字段的数据用以下方式表达

class User extends CActiveRecord {
    //define the number of levels that you need
    const LEVEL_REGISTERED = 0, LEVEL_AUTHOR = 1, LEVEL_ADMIN = 6, LEVEL_SUPERADMIN = 99;

    //define the label for each level
    static function getAccessLevelList($level = null) {
        $levelList = array(
            self::LEVEL_REGISTERED => 'Registered',
            self::LEVEL_AUTHOR => 'Author',
            self::LEVEL_ADMIN => 'Administrator'
        );
        if ($level === null)
            return $levelList;
        return $levelList[$level];
    }
}

//using it in forms
$form->dropDownList($model, 'accessLevel', $model->accessLevelList);
//using it in DetailView
$this->widget('zii.widgets.CDetailView', array(
    'data' => $model,
    'attributes' => array(
        //...,
        array(
            'name' => 'accessLevel',
            'value' => $model->accessLevelList[$model->accessLevel],
        ),
    ),
));
//using it in GridView
$this->widget('zii.widgets.CGridView', array(
    'dataProvider' => $model->search(),
    'columns' => array(
        //...,
        array(
            'name' => 'accessLevel',
            'value' => '$data->accessLevelList[$data->accessLevel]',
        ),
    ),
));
//display the administrator label 
echo User::getAccessLevelList(User::LEVEL_ADMIN);

以上就是所有内容,希望这对你有所帮助。