控制器中的验证错误返回 401 而不是 400

Mar*_*cin 4 spring-security spring-boot spring-security-oauth2

我的休息控制器中有一个后端点,无需身份验证/授权即可访问。它在 WebSecurityConfigurerAdapter 中配置如下:

@Override
public void configure(WebSecurity web) {
    web.ignoring().antMatchers("/api/v1/user");
}
Run Code Online (Sandbox Code Playgroud)

端点对输入数据进行验证(由注释 javax.validation.Valid 提供)。当我发送无效数据时,我收到 401 响应而不是 400。此问题在发送默认 Spring Boot 400 消息的安全端点中不存在。

在调试过程中,我发现在处理 MethodArgumentNotValidException(控制器中发生验证错误时抛出)期间,执行 WebExpressionVoter 并返回值 -1,这意味着“访问被拒绝”。如何配置我的应用程序以忽略公共端点的安全检查?

我知道使用 ControllerAdvice 进行异常处理是一种选择,但是是否可以有默认的 400 消息?

预先感谢您的任何提示!

编辑:

Security filter chain: [
  WebAsyncManagerIntegrationFilter
  SecurityContextPersistenceFilter
  HeaderWriterFilter
  LogoutFilter
  OAuth2AuthenticationProcessingFilter
  RequestCacheAwareFilter
  SecurityContextHolderAwareRequestFilter
  AnonymousAuthenticationFilter
  SessionManagementFilter
  ExceptionTranslationFilter
  FilterSecurityInterceptor
]
Run Code Online (Sandbox Code Playgroud)

Mar*_*cin 7

好的,我找到了解决方案。我不知道为什么,但是当发生异常时,有另一个POST请求到这个url:/error。当我将此网址添加到我的忽略列表中时,它就开始工作了。所以我的配置如下所示:

@Override
public void configure(WebSecurity web) {
    web.ignoring().antMatchers("/api/v1/user", "/error/**")
}
Run Code Online (Sandbox Code Playgroud)

@Ken Chan 感谢您提供有关调试过滤器的信息!这是至关重要的。