首页 > 解决方案 > 使用 OAuth2 从 Spring Boot 1.4 迁移到 1.5

问题描述

尝试将 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 的发行说明,我认为这可能与有关:

[...] 使用 @EnableWebSecurity 将关闭网络安全的所有自动配置,从而允许您完全控制。

请记住,该应用程序在 Spring Boot 1.3 和 1.4 中运行良好。当我升级到 1.5 时,我遇到了这个问题。

06/07 更新: Autowired FilterChainProxy 查看涉及的过滤器并在 2 个 Spring Boot 版本之间进行比较。如果我理解正确,那就是问题所在。在 1.4.x 版本中,FilterChainProxy 内部过滤器链的顺序基本是:

  1. OAuth auth* 过滤器链,匹配 /oauth/token、/oauth/token_key 和 /oauth/check_token。
  2. OAuth“受保护”端点。我相信资源服务器配置中的 HttpSecurity 中定义的东西。此处的过滤器链为此使用“NotOAuthRequestMatcher”匹配器。我相信,该链中的重要过滤器是 OAuth2AuthenticationProcessingFilter,它发挥了所有作用。
  3. 最后是使用 AnyRequestMatcher 匹配器的过滤器链。将匹配任何请求,并且该链中的重要过滤器是 UsernamePasswordAuthenticationFilter。这就是我相信的“用户工作流程”。

现在,当使用 1.5.x 时,不知何故,上面的#2 和#3 被切换了。这就解释了为什么我的 Web 服务请求没有到达我的 Web 服务端点。不明白为什么订单搞砸了(我的配置中没有使用任何@Order)。我猜是时候研究@Order了......

其他人遇到过这个问题吗?你是怎么解决的?

标签: spring-bootspring-oauth2

解决方案


果然,诀窍是将以下内容添加到我的WebSecurity ConfigurerAdapter扩展中:

@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)

在这里找到关于 SO 的答案。


推荐阅读