Yii2 的过滤器在权限验证中的使用笔记

新建的AuthController控制器继承了\yii\rest\Controller, 在控制器中设置了 HttpBasicAuth来进行身份认证,我当初的想法是,认证完了,再用User组件配合RBAC来进行权限验证,验证的切入点就在控制器的beforeAction方法里进行。于是写了一个checkAccess的方法来验证权限,checkAccess里使用了User组件进行身份检查, 控制器的beforeAction是这样写的: public function beforeAction($action)

    {
        if($this->checkAccess() &&
        parent::beforeAction($action)){
return true;
}
return false;
}

  

结果测试的时候发现httpBasicAuth认证成功了,但是 checkAccess里的User身份老是 Guest ,(httpBasicAuth认证成功后,User组件会登记当前的用户身份。)百思不得其解( 其实是我太菜了), 哦,查看了Yii2的过滤器的代码后才发现原来是这么一回事。

这里记录一下,免得过几天又忘记了。

Yii2的过滤器其实也是特殊的行为(behavior), (手册也有说,但是我没有搞明白它的原理), 为什么说过滤器是一种特殊的行为呢。过滤器是在控制器的动作执行前运行,也可以在控制器的动作执行后运行。但是行为(behavior)是用来扩展组件的功能的,行为本身并不能自动执行,必须要附加到目标对象手动去调用才行,过滤器 ActionFilter 是继承 Behavior的所以它也是一种行为(behavior), 它自动执行的特殊性是因为它重写了 父类(behavior)的 attach方法和 detach, 它在attach里绑定了 控制器里Controller::EVENT_BEFORE_ACTION事件,headle是过滤器的beforeFilter方法,而beforeFilter方法又调用了过滤器的beforeAction方法。 beforeFilter里还绑定了 Controller::EVENT_AFTER_ACTION事件。所以过滤器要实现beforeAction或afterAction方法。

最后,所有的控制器都继承了\yii\base\Controller, \yii\base\Contoller里的beforeAction触发了Controller::EVENT_BEFORE_ACTION事件来运行过滤器。

所以控制器中的beforeAction要想先运行过滤器,就要先执行Parent::beforeAction($action).

代码改成: 

public function beforeAction($action)
    {
        if (parent::beforeAction($action) == false) { // TODO: Change the autogenerated stub
            return false;
        }
        return $this->checkAccess();
    }

  就OK了。。哎,真是太菜了。

 

posted @ 2024-02-20 01:03  Qing42  阅读(49)  评论(0编辑  收藏  举报