spring-security 为什么Spring响应状态异常400转换为403

zz2j4svz  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(224)

我有一个Sping 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();
  }

在我的应用程序代码中,我抛出了一个ResponseStatusException:

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年8月13日12:32:09.260-07:00警告79360 --- [nio-8080-exec-6] .w.s.m.a.响应状态异常解决程序:已解决[org.springframework.web.server.响应状态异常:400 BAD_REQUEST“名为tenant 1的租户已存在”]
为什么响应没有得到我在异常中设置的400响应代码?

5rgfhyps

5rgfhyps1#

问题是Sping Boot 时启用了ErrorMvcAutoConfiguration。我看到的403错误是因为抛出异常时的默认行为是以anonymous用户的身份提供/error页面。在我看来,这与新用户如何配置他们的Web安全性交互很差。我能够通过更改安全配置来允许匿名访问/error页面来解决此问题。
我只能通过在AffirmativeBased#decide中添加断点并检查请求来找出问题所在。我注意到请求是针对/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})

相关问题