【问题标题】:Validation error in controller returns 401 instead of 400控制器中的验证错误返回 401 而不是 400
【发布时间】:2019-06-06 19:33:38
【问题描述】:

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

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

端点具有输入数据的验证(由注释 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
]

【问题讨论】:

    标签: spring-boot spring-security spring-security-oauth2


    【解决方案1】:

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

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

    @Ken Chan 感谢您提供有关调试过滤器的信息!这很关键。

    【讨论】:

    • 恭喜。所以这意味着你的/api/v1/user 被重定向到/error/** 以防出错,/error/ 由 spring security 保护.....
    【解决方案2】:

    使用webSecurity.ignoring() 将导致对该URL 的请求完全绕过整个安全过滤器链。所以有趣的是WebExpressionVoter 仍然会为这些被忽略的 URL 启动。

    所以,我猜测以下可能性:

    • /api/v1/user 将被重定向到其他受保护的 URL。

    • 您认为antMatchers("/api/v1/user") 将匹配/api/v1/user 下的所有URL,例如/api/v1/user/1。但是,它只匹配 /api/v1/user

    要忽略 /api/v1/user 下的所有 URL,您应该使用:

     web.ignoring().antMatchers("/api/v1/user/**");
    

    【讨论】:

    • 感谢您的回复。我检查了一下,并在 {{host}}/api/v1/user 上发送了一个发布请求,所以我认为这不是问题。在调试日志中,我看到这样的东西:检查请求匹配:AntPathRequestMatcher:'/api/v1/user';反对'/api/v1/user'。你能告诉我可以忽略安全过滤器的过滤器在哪里吗?
    • 有趣,/api/v1/user 会被重定向到其他 URL 吗?它们在FilterChainProxy 处被忽略。能否请您设置@EnableWebSecurity(debug = true),以便在日志中可以看到用于处理请求的过滤器?
    • 我在问题中添加了过滤器链。不,这只是一个简单的 POST 请求。
    猜你喜欢
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 2019-07-03
    • 2014-03-28
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    相关资源
    最近更新 更多