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了。。哎,真是太菜了。