提问者:小点点

为什么Spring Response seStatusException 400被翻译成403


我有一个带有此安全配置的Spring Boot应用程序:

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .headers().frameOptions().sameOrigin().and()
        .addFilterBefore(jwtTokenFilter, UsernamePasswordAuthenticationFilter.class)
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
        .authorizeRequests()
            .antMatchers("/api/authenticate/**", "/h2-console/**").permitAll()
            .anyRequest().authenticated();
  }

在我的应用程序代码中,我抛出了一个响应状态异常:

    if (existingTenant.isPresent()) {
      throw new ResponseStatusException(
          HttpStatusCode.valueOf(400),
          "Tenant with name " + tenant.name() + " already exists");
    }

但是我得到的api响应是403:

* Mark bundle as not supporting multiuse
< HTTP/1.1 403 
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: SAMEORIGIN
< Content-Length: 0
< Date: Sat, 13 Aug 2022 19:26:27 GMT
< 
* Connection #0 to host localhost left intact

我看到的唯一日志记录是:

2022-08-13T12:32:09.260-07:00 WARN 79360---[nio-8080-exec-6].w.s.m.a.响应状态异常解析器:已解决[org.springframe.web.server.响应状态异常:400BAD_REQUEST名称为tenant1的租户已存在]

为什么响应没有得到我在异常中设置的400响应代码?


共1个答案

匿名用户

问题是Spring boot启用了ErrorMvcAutoConfiguration。我看到的403错误是因为抛出异常时的默认行为是将/error页面作为匿名用户提供服务。在我看来,这与新用户如何配置其Web安全交互不佳。我能够通过更改我的安全配置以允许匿名访问/error页面来解决这个问题。

我只能通过在AffirmativeBase#决定中添加断点并检查请求来找出问题所在。我注意到请求是/error而不是原始url,所以我能够对发生的事情做出一些有根据的猜测。

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .headers().frameOptions().sameOrigin().and()
        .addFilterBefore(jwtTokenFilter, UsernamePasswordAuthenticationFilter.class)
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
        .authorizeRequests()
            .antMatchers("/api/authenticate/**", "/h2-console/**").permitAll()
            // ---------------------------------------------
            .antMatchers("/error").anonymous() // <----- Fix
            .anyRequest().authenticated();
  }

处理此问题的另一种方法是通过在@SpringBootApplication的任何地方添加此注释来禁用自动配置:

@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class})