2017-11-24 18:10:32 3033次浏览 1条回答 0 悬赏 40 金钱

项目前后分离,接口时restful,我在main.php里配置了AccessControl,如下

'as access' => [
    'class' => 'rbac\components\AccessControl',
    'allowActions' => [
        'v1/user/login',
    ]
],

我在BaseController中重写了behaviors函数,添加了通过HttpBearerAuth做access_token的验证,如下:

public function behaviors()
{
    $behaviors = parent::behaviors(); 
    $behaviors['authenticator'] = [
        'class' => HttpBearerAuth::className(),
        'optional' => [
                'login',
                'signup',
                'logout'
        ],
    ];


    return $behaviors;
}

我登录后,在请求其他接口时,按理说会先执行HttpBearerAuth的token验证,然后再执行AccessControl的beforeAction做权限过滤,但是我这样配置后,调试发现,总是先执行了AccessControl的beforeAction,因为此时还没有做token的登录认证,所以提示“Login required”. 感觉是配置顺序除了问题。在config->main.php中配置的'as access' => 'AccessControl'会在其他行为执行之前先执行吗?

补充于 2018-03-25 15:02

已解决。

之前我是在main中配置了AccessControl,然后在BaseController中设置了authenticator,执行的顺序为先AccessControl再authentication,这样就导致在AccessControl中所有的动作都是出于未登陆状态返回401。正确的执行顺讯应该显示authentication然后再AccessControl。最后根据@6把刀的提示,我在基类控制器BaseController中修改如下

 $behaviors['authenticator'] = [
                'class' => HttpBearerAuth::className(),
                'optional' => [
                    'login',
                    'signup',
                    'logout'
                ],
            ];

 $behaviors['access'] = [
    'class' => 'rbac\components\AccessControl',
         'allowActions' => [
             'login',
    ]
 ];

不再在main中的component中配置AccessControl。这样执行的顺序就是先authentication然后再AccessControl了。
现在的疑问是,main配置中的会最先执行吗,因为对yii2的源码也不太了解,不知道执行顺序是怎么样的。我这样是解决问题了,是否有更优雅的方式呢?

最佳答案

  • mercis 发布于 2017-11-25 22:12 举报

    打印head头里面有木有数据

    5 条回复
    回复于 2017-11-27 10:41 回复

    有的,Authorization字段是token,因为先走了AccessControl的beforeAction,还没走到认证阶段,所以提示未登录

    回复于 2017-12-11 15:00 回复

    查看behaviors的数组,行为是从上往下执行的。你可以更改数组的顺序达到你要的

    回复于 2018-03-25 14:54 回复

    你说的是对的,我把对AccessControl的配置从main中拿到了controller中配置并在authenticator之后添加,执行顺序就正确了。

    回复于 2018-04-02 11:48 回复

    建一个BaseCongtroller.php这个为基类,在这个基类的behaviors里去处理这个循序与过滤器,不要在main里面去配置。基它类都继承这个基类就OK

    回复于 2018-04-02 16:02 回复

    是滴是的,现在就是这么解决的。

    没有找到数据。
您需要登录后才可以回答。登录 | 立即注册
齐天大圣
主管

齐天大圣 北京

注册时间:2016-02-24
最后登录:2020-06-05
在线时长:18小时30分
  • 粉丝6
  • 金钱550
  • 威望0
  • 积分730

热门问题