HttpStatus在Spring Boot 3.0.0中不能正确处理抛出的异常



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

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

有4类:

DemoApplication-应用程序启动器

CustomAuthFilter-自定义认证过滤器,将虚拟认证设置为AuthManager。

Web配置- web安全配置。任何请求都需要身份验证。

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

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

是这个bug吗?还是我错过了什么?我在3.0.0发行说明中找不到任何与此相关的内容。它在2.7中工作得很好。*版本,甚至在3.0.0- rc1,但在3.0.0- rc2和3.0.0更改。

谢谢!

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

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

所以我猜这与Spring Security filter有某种关系。

我尝试了不同版本的SpringBoot - 2.7.5 (ok), 3.0.0- rc1 (ok), 3.0.0- rc2(不ok), 3.0.0(不ok)

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

根据我的理解,安全过滤器链现在在所有分派类型上运行。以前,它没有在错误调度程序上运行。您可以通过调用:

恢复到原来的行为http.authorizeHttpRequests().shouldFilterAllDispatcherTypes(false)

在调度错误以不验证请求时导致重新过滤的原因是OncePerRequestFilter的使用。由于您已经在第一次分派时执行了筛选器,因此在分派错误时,它将不会再次运行。因此,另一种解决方法是使用普通的Filter


来源:

  • https://github.com/spring-projects/spring-boot/issues/31852 issuecomment - 1193695450
  • Spring security 6.0 AuthorizationFilter - shouldFilterAllDispatcherTypes的默认值有问题

最新更新