Yii基于RBAC的权限控制

之前用过一个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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值