Spring Boot 3中Spring Security对POST请求始终返回HTTP 403求助
问题:Spring Boot 3中POST请求返回403,GET请求正常
正在运行一个现有的Spring Boot 3应用,遇到以下问题:除/health和/info接口外,Spring Security对所有POST请求均返回HTTP 403状态码,而GET请求可正常通过认证。
错误响应
{ "timestamp": "2023-11-28T21:31:49.646+00:00", "status": 403, "error": "Forbidden", "path": "/test-service/v1/test" }
POM依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
ActuatorSecurity配置类
@Configuration @EnableWebSecurity public class ActuatorSecurityConfig { @SuppressWarnings("squid:S2068") private static final int BCRYPT_STRENGTH = 16; @Value("${metrics_password}") private String metricsPassword; @Bean public InMemoryUserDetailsManager userDetailsManager() { BCryptPasswordEncoder encoder = passwordEncoder(); String result = encoder.encode(metricsPassword); UserDetails user = User .withUsername("actuator") .password(result) .roles("ACTUATOR_ADMIN") .build(); return new InMemoryUserDetailsManager(user); } @Bean public static BCryptPasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(BCRYPT_STRENGTH); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http .authorizeHttpRequests() .anyRequest().permitAll() .and().httpBasic() .and() .build(); } }
application.properties配置
metrics_password = password123
疑问与排查请求
GET请求无需额外认证即可通过,那POST请求是否需要携带Basic Auth认证头?恳请提供排查建议。
排查建议
- 检查CSRF防护:Spring Security默认开启CSRF防护,会对POST、PUT、DELETE等修改型请求校验CSRF Token,GET请求不受该规则约束。你的当前配置未关闭CSRF,这是最可能的原因。可以临时在
filterChain中添加.csrf(csrf -> csrf.disable())测试是否恢复正常,但生产环境建议通过配置CSRF Token而非直接关闭来解决。 - 排查是否存在多Security配置类:Spring Boot会加载所有标记
@Configuration的Security配置类,若存在其他配置,可能会覆盖当前anyRequest().permitAll()的规则,导致POST请求被拦截。检查项目中是否有其他@EnableWebSecurity的配置类。 - 查看Security日志:开启DEBUG级别的Spring Security日志,添加配置
logging.level.org.springframework.security=DEBUG到application.properties,通过日志追踪POST请求的认证授权流程,明确被拒绝的具体原因。 - 测试携带Basic Auth头:尽管配置了
permitAll,仍可尝试在POST请求中携带actuator/password123的Basic Auth头,验证是否能正常响应,排除是否存在未被发现的认证规则。 - 确认Actuator配置是否影响全局:检查Actuator的端点暴露配置(如
management.endpoints.web.exposure.include),确认是否有额外的Security拦截规则被应用到全局接口。
内容的提问来源于stack exchange,提问作者JsbDev
相关产品推荐
相关产品推荐

