使用 OAuth2 从 Spring Boot 1.4 迁移到 1.5
Migrating from Spring Boot 1.4 to 1.5 with OAuth2
正在尝试将 1.3.x 中的 "old" 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
换句话说,那些 "against" 中的 none 就像我在 configure( HttpSecurity http ) 中配置的一样:
http
.authorizeRequests()
.antMatchers( "/v1/**" )
.permitAll()
.and().csrf().disable()
Sprint Boot 1.4 中的相同代码工作正常,它确实按预期根据模式 /v1/** 检查传入请求。
我已经阅读了 Spring Boot 1.5 的发行说明,我认为它可能与 this:
有关
[...] using @EnableWebSecurity will switch off all auto-configuration of web security thereby allowing you to take complete control.
记住,该应用程序在Spring Boot 1.3 和1.4 中运行良好。我在升级到 1.5 时遇到了这个问题。
06/07 更新:
自动装配 FilterChainProxy 以查看涉及的过滤器并比较 2 Spring 启动版本。如果我理解正确,那就是问题所在。
在1.4.x版本中,FilterChainProxy内部的过滤器链顺序基本是:
- OAuth auth* 过滤器链,匹配 /oauth/token、/oauth/token_key 和 /oauth/check_token.
- OAuth "protected" 端点。我相信资源服务器配置中 HttpSecurity 中定义的内容。这里的过滤器链为此使用 "NotOAuthRequestMatcher" 匹配器。该链中的重要过滤器是 OAuth2AuthenticationProcessingFilter,我相信它可以发挥所有作用。
- 最后一个是使用 AnyRequestMatcher 匹配器的过滤器链。将匹配任何请求,该链中的重要过滤器是 UsernamePasswordAuthenticationFilter。这就是我相信的"User Workflow"。
现在使用1.5.x时,不知何故,上面的#2和#3被调换了。这解释了为什么我的 Web 服务请求没有命中我的 Web 服务端点。
不明白为什么订单搞砸了(我没有在我的配置中使用任何@Order)。我想是时候研究一下@Order了...
还有其他人遇到过这个问题吗?你是怎么解决的?
果然,诀窍是将以下内容添加到我的 WebSecurity ConfigurerAdapter 扩展中:
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
在 SO .
上找到答案
正在尝试将 1.3.x 中的 "old" 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
换句话说,那些 "against" 中的 none 就像我在 configure( HttpSecurity http ) 中配置的一样:
http
.authorizeRequests()
.antMatchers( "/v1/**" )
.permitAll()
.and().csrf().disable()
Sprint Boot 1.4 中的相同代码工作正常,它确实按预期根据模式 /v1/** 检查传入请求。
我已经阅读了 Spring Boot 1.5 的发行说明,我认为它可能与 this:
有关[...] using @EnableWebSecurity will switch off all auto-configuration of web security thereby allowing you to take complete control.
记住,该应用程序在Spring Boot 1.3 和1.4 中运行良好。我在升级到 1.5 时遇到了这个问题。
06/07 更新: 自动装配 FilterChainProxy 以查看涉及的过滤器并比较 2 Spring 启动版本。如果我理解正确,那就是问题所在。 在1.4.x版本中,FilterChainProxy内部的过滤器链顺序基本是:
- OAuth auth* 过滤器链,匹配 /oauth/token、/oauth/token_key 和 /oauth/check_token.
- OAuth "protected" 端点。我相信资源服务器配置中 HttpSecurity 中定义的内容。这里的过滤器链为此使用 "NotOAuthRequestMatcher" 匹配器。该链中的重要过滤器是 OAuth2AuthenticationProcessingFilter,我相信它可以发挥所有作用。
- 最后一个是使用 AnyRequestMatcher 匹配器的过滤器链。将匹配任何请求,该链中的重要过滤器是 UsernamePasswordAuthenticationFilter。这就是我相信的"User Workflow"。
现在使用1.5.x时,不知何故,上面的#2和#3被调换了。这解释了为什么我的 Web 服务请求没有命中我的 Web 服务端点。 不明白为什么订单搞砸了(我没有在我的配置中使用任何@Order)。我想是时候研究一下@Order了...
还有其他人遇到过这个问题吗?你是怎么解决的?
果然,诀窍是将以下内容添加到我的 WebSecurity ConfigurerAdapter 扩展中:
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
在 SO