Spring Boot 3.0.0 中抛出异常的 HttpStatus 未正确处理

2023-12-06

我刚刚迁移到 SpringBoot 3.0.0,但发现应用程序在抛出异常时无法正确处理 HttpStatus。它总是给出 403 FORBIDDEN(或为未经身份验证的请求配置的其他代码)。似乎在捕获异常或其他原因后身份验证就会丢失。 我在这里做了一个简约的例子:

https://gitlab.com/gobanit-public/stack-overflow/spring-boot-3-http-status-bug

有4个班级:

演示应用程序- 应用程序启动器

自定义验证过滤器- 自定义身份验证过滤器,将虚拟身份验证设置为 AuthManager。

网页配置- 网络安全配置。任何请求都需要身份验证。

测试控制器- 具有三个端点的基本控制器 - 一个用于成功,两个用于失败

调用成功端点时,您会收到响应。身份验证工作正常。当调用失败端点时,它会抛出 HttpResponseException 和 HttpStatus.BAD_REQUEST (400)。但是,我没有得到 400 响应,而是得到 403 响应。这似乎不对。当调用第二个失败端点时也会发生同样的情况,它不会抛出异常,而是直接写入错误响应。

是这个bug吗。或者我错过了什么?我在 3.0.0 发行说明中找不到与此相关的任何内容。它在 2.7.* 版本甚至 3.0.0-RC1 中运行良好,但在 3.0.0-RC2 和 3.0.0 中发生了变化。

Thanks!

我在没有 Spring Security 的情况下尝试过 - 它工作正常。

我尝试使用默认的基本身份验证,没有自定义身份验证过滤器 - 它也工作得很好。

所以我猜它与 Spring Security 过滤器有某种关系。

我尝试了不同版本的SpringBoot - 2.7.5(好的),3.0.0-RC1(好的),3.0.0-RC2(不好),3.0.0(不好)


我升级后也遇到这个问题了。

据我了解,安全过滤器链现在在所有调度类型上运行。以前它不在错误调度程序上运行。您可以通过调用以下命令恢复到旧的行为:

http.authorizeHttpRequests().shouldFilterAllDispatcherTypes(false)

发送错误时导致重新过滤而不使您的请求经过身份验证的原因是使用OncePerRequestFilter。由于您已经在第一次调度时执行了过滤器,因此当调度错误时它不会再次运行。因此,另一种解决方法是使用简单的Filter反而。


Sources:

  • https://github.com/spring-projects/spring-boot/issues/31852#issuecomment-1193695450
  • Spring security 6.0 AuthorizationFilter - ShouldFilterAllDispatcherTypes 的默认值有问题
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 3.0.0 中抛出异常的 HttpStatus 未正确处理 的相关文章

随机推荐