我正在尝试运行现有的 Spring Boot 3 应用程序,但我发现这很难,因为 Spring Security 总是为除
/health
和 /info
之外的所有请求返回 HTTP 403。
错误响应:
{
"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();
}
}
应用程序.属性
metrics_password = password123
这是否需要在请求中包含 Basic Auth 身份验证标头?我发现这很令人困惑,因为 GET 请求的身份验证没有任何问题。
如有任何建议,我们将不胜感激。
检查这个403是否是缺少CSRF token导致的。这可以通过调整
CsrfFilter
中 application.yaml
的日志记录级别来完成:
logging.level:
org.springframework.security.web.csrf.CsrfFilter: debug
您也可以尝试禁用CSRF保护
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
// ...
.csrf(c -> c.disable())