Yii基于RBAC的权限控制

来源:互联网 发布:显示iphone在线软件 编辑:程序博客网 时间:2024/05/17 03:37

之前用过一个Yii的扩展srbac 很强大,现在主要介绍一下Yii自带的权限控制的实现

  • 在controller中添加过滤器和过滤规则
    /**     * @return array action filters     */    public function filters()    {        return array(            'accessControl', // perform access control for CRUD operations            //array(               //'COutputCache + view'//表示对view这个action起作用,               //'duration'=>100,               //'varyByParam'=>array('id'),            //),        );    }    /**     * Specifies the access control rules.     * This method is used by the 'accessControl' filter.     * @return array access control rules     */    public function accessRules()    {        return array(            array('deny', // allow authenticated users to access all actions                'actions'=>array('onlyadmin'),                'roles'=>array('user')            ),        );    }
  • 在main.php里面添加authManager component
'authManager'=>array(    'class'=>'CPhpAuthManager',    'defaultRoles'=>array('guest'),),

根据以上配置,controller中的onlyadmin这个action不允许role为user的用户去访问

  • 创建role并把用户分配到该角色下
//创建role$auth=Yii::app()->authManager;$role=$auth->createRole('admin','role admin');$role=$auth->createRole('user','role user');$role=$auth->createRole('guest','role guest');$auth->save();//把用户分配到某个role下面$auth=Yii::app()->authManager;$auth->assign('user',Yii::app()->user->id);$auth->save();
  • RBAC之外的权限控制
    可能有些人觉得这样控制还是比较麻烦,Yii还提供了基于expression 的验证方式
    • 扩展CWebUser(可以通过重写user类或者修改UserIdentityauthenticate 方法)
    //修改UserIdentity    public function authenticate()    {        $user=User::model()->find('LOWER(username)=?',array(strtolower($this->username)));        if($user===null)            $this->errorCode=self::ERROR_USERNAME_INVALID;        else if(!$user->validatePassword($this->password))            $this->errorCode=self::ERROR_PASSWORD_INVALID;        else        {            $this->_id=$user->id;            $this->username=$user->username;            $this->setState('role', $user->role);//setState可以直接传递给CWebUser            $this->errorCode=self::ERROR_NONE;        }        return $this->errorCode==self::ERROR_NONE;    }    //修改controoler中的accessRules方法    public function accessRules()    {        return array(            array('deny', // allow authenticated users to access all actions                'actions'=>array('onlyadmin'),                //'roles'=>array('user')                'expression' => '$user->role == "user"'//$user = Yii::app()->user            ),        );    }

这样就可以和项目中已有的role结合起来了

  • 本例中使用的是CPhpAuthManager,默认会在data 目录下生成一个auth.php
  • 如果想要使用数据库把CPhpAuthManager换乘CDbAuthManager,然后按照文档配置下即可
0 0
原创粉丝点击