【发布时间】:2019-10-22 06:14:48
【问题描述】:
尝试将 1.3.x 中的“旧”Sprint Boot + Spring OAuth2 应用程序升级到 2.1.5.RELEASE 或当时的任何版本。
我只是想一步一步做。 我从 Spring Boot 1.3 到 1.4 得到了它,一切似乎都运行良好。
问题是从 1.4 到 1.5。基本上,我的资源服务器保护的 Web 服务似乎根本没有受到影响(我相信它正在退回到 WebSecurity/User 工作流程,将 302 重定向返回到登录页面)。
从日志中我可以看到,它甚至没有尝试将我的请求与我在 ResourceServerConfigurerAdapter 中定义的模式匹配。
[...].AntPathRequestMatcher::matches::::::Checking match of request : '/v1/private/user'; against '/oauth/token'
...(same as above against other paths)...
[...].OrRequestMatcher::matches::::::No matches found
换句话说,这些“反对”都不像我在 configure( HttpSecurity http ) 中配置的那样:
http
.authorizeRequests()
.antMatchers( "/v1/**" )
.permitAll()
.and().csrf().disable()
Sprint Boot 1.4 中的相同代码可以正常工作,它会按预期根据该模式 /v1/** 检查传入请求。
我已经阅读了 Spring Boot 1.5 的发行说明,我认为它可能与 this 有关:
[...] 使用 @EnableWebSecurity 将关闭网络安全的所有自动配置,从而让您完全控制。
记住,该应用程序在 Spring Boot 1.3 和 1.4 中运行良好。当我升级到 1.5 时,我遇到了这个问题。
06/07 更新: Autowired FilterChainProxy 查看涉及的过滤器并在 2 个 Spring Boot 版本之间进行比较。如果我理解正确,那就是问题所在。 在 1.4.x 版本中,FilterChainProxy 内部过滤器链的顺序基本是:
- OAuth auth* 过滤器链,匹配 /oauth/token、/oauth/token_key 和 /oauth/check_token。
- OAuth“受保护”端点。我相信资源服务器配置中的 HttpSecurity 中定义的东西。此处的过滤器链为此使用“NotOAuthRequestMatcher”匹配器。我相信,该链中的重要过滤器是 OAuth2AuthenticationProcessingFilter,它发挥了所有作用。
- Last 是使用 AnyRequestMatcher 匹配器的过滤器链。将匹配任何请求,并且该链中的重要过滤器是 UsernamePasswordAuthenticationFilter。这就是我认为的“用户工作流程”。
现在在使用 1.5.x 时,不知何故,上面的 #2 和 #3 被切换了。这就解释了为什么我的 Web 服务请求没有到达我的 Web 服务端点。 不明白为什么订单搞砸了(我的配置中没有使用任何@Order)。是时候研究一下@Order 我猜...
其他人遇到过这个问题吗?你是怎么解决的?
【问题讨论】: