我有一个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
响应代码?
1条答案
按热度按时间5rgfhyps1#
问题是Sping Boot 时启用了ErrorMvcAutoConfiguration。我看到的403错误是因为抛出异常时的默认行为是以
anonymous
用户的身份提供/error
页面。在我看来,这与新用户如何配置他们的Web安全性交互很差。我能够通过更改安全配置来允许匿名访问/error
页面来解决此问题。我只能通过在
AffirmativeBased#decide
中添加断点并检查请求来找出问题所在。我注意到请求是针对/error
的,而不是针对原始url的,因此我能够对发生了什么做出一些有根据的猜测。处理此问题的另一种方法是通过在
@SpringBootApplication
中添加以下注解来禁用自动配置: