数据库
首先在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);
以上就是所有内容,希望这对你有所帮助。