我最近将我的Sping Boot MVCKotlin项目迁移到了Spring Boot 3。REST控制器(通过SecurityFilterChain
配置-也是从基于WebSecurityConfigurerAdapter
的安全性迁移而来)使用了基本的auth。从那时起,所有由suspend控制器方法处理的端点调用都返回403。对于其他端点,它工作正常。
所有端点在迁移之前都工作正常。当我们使控制器方法不挂起(使用runBlocking
)时,它工作正常。
有趣的是,控制器方法的主体被执行了。我注意到,请求不止一次地通过安全过滤器链,并且它在默认的AnonymousAuthenticationFilter
中被标记为未授权。那里的请求参数不包含所需的auth头,即使它在第一次通过时包含。
某些默认HttpSecurity
逻辑被禁用:
http
.csrf().disable()
.headers().disable()
.sessionManagement().disable()
.securityContext().disable()
.requestCache().disable()
.servletApi().disable()
.apply(DefaultLoginPageConfigurer()).disable()
.logout().disable()
似乎当涉及到协程时,授权逻辑被触发了两次。一次是正确地工作。第二次是因为缺少auth头而失败。
我尝试启用禁用的默认值,但没有帮助。
1条答案
按热度按时间vx6bjr1n1#
所以经过更多的调试和咨询一些SpringMaven后,我发现了它的作用,它是三个因素的结合:
1.在新的Spring版本中,不仅初始请求处理(调度程序类型“REQUEST”)通过安全链,但在异步调用的情况下,就像我使用Kotlin挂起处理程序方法那样,即使在新线程中启动的异步处理也必须经过它这意味着授权被完成两次。2.
BasicAuthenticationFilter
是仅在第一过滤轮中运行的OncePerRequestFilter
-安全上下文这次不被更新。1.由于我们禁用了请求之间的安全上下文存储
http.securityContext().disable()
,因此它在第二轮过滤中丢失,因此该请求未经授权。对此有几种可能的解决方案。或者禁用对具有“ASYNC”调度器类型的请求的安全链处理,允许记住请求之间的安全上下文,或者其他一些。