我有一个带有此安全配置的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
响应代码?
问题是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})