多个SecurityFilterChain执行顺序问题,/oauth2/authorization报404

正常要请求/oauth2/authorization/{regId}跳转到authorization-uri进行认证的,但是搭建好之后,请求这个地址竟然直接报404了,说明oauth2的相关filter并没有生效,直接打到了dispatchServlet。

那到底是哪里的问题呢?debug一天发现在FilterChaninProxy中发现了问题所在。

需要知道的是oauth2对于这个uri处理的filter是OAuth2AuthorizationRequestRedirectFilter进行重定向的。

出问题的时候 FilterChaninProxy中的List<SecurityFilterChain> filterChains 有三组。

第一组:是处理普罗米修斯相关的内容,不用考虑。

 第二组:拦截路径是/**,filter有12个。但是里面并没有需要的filter。 

第三组:拦截地址也是任意请求,里面我们需要的filter。其实这里可以看出这个chain里面的filter和oauth2的流程密切相关。

那既然chain里面有需要的filter,为什么没有拦截到呢。一通查找,在官网上看到了相关描述如下:

 大概意思就是说如果有多组SecurityFilterChain,只要有一组chain能匹配到,后面的chain中的filter就不会执行了。这不就是现在碰到的问题吗?第二组的chain拦截路径/**其实已经执行过了,第三组中的filter是不会执行的。在代码中的体现就是下面的代码:

 三组securityFilterChain只要有一组匹配的上就返回。

好了,发现问题了,那这个问题怎么来的呢?这个顺序哪里决定的呢?又是一通debug

找到了这三个chain和WebSecurityConfigurer 配置有关。

 启动过程中会找WebSecurityConfigurer 的相关bean。这里找到了三个:

前两个是项目上自定义的webSecurity相关的。第三个是@EnableResourceServer相关的。

但是这个顺序还不是最后的顺序。 

  得到三个配置之后会进行排序。排序之后的顺序就变成下面的样子了:

 还有一点需要注意:排序完不能有顺序相同的configure,不然会抛异常。

 上面三个配置会被WebSecurity webSecurity 用来构建SecurityFilterChain,因此只要解决这里configure的构建顺序让@EnableResourceServer相关的放到webSecurityConfigure之后,就可以调整securityFilterChain的顺序了。

对于@EnableResourceServer 配置默认order是3,在源码上可以看到。

 因为另外一个SecurityConfigure顺序是2,所以对于项目上继承WebSecurityConfigurerAdapter的配置设置顺序为1。

 至此,问题解决了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姑苏冷

您的打赏是对原创文章最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值