最近我将 Spring Boot 版本从 2.5.2 更新到 3.1.5 ,之前我有这个安全配置
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.requestMatcher(EndpointRequest.to("health"))
.authorizeHttpRequests(request-> request.anyRequest().permitAll());
return http.build();
}
此配置将要求对执行器端点进行身份验证,“/health”除外 但是新版本的Spring Boot不支持这个配置,所以我改成了这样
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(request->
request.requestMatchers(EndpointRequest.to(HealthEndpoint.class)).permitAll()
.anyRequest().permitAll()
);
return http.build();
}
但这不起作用,因为我在尝试访问“/health”时仍然看到登录表单
我尝试将 HealthEndpoint.class 替换为 “health”,但也没有帮助。
也许我的配置写错了,或者Spring有Actuator端点的自动配置。
根据 documentation 所有
actuator
端点默认放置在 /actuator
路径下。路径并基于它你必须重写securityFilterChain
。
不用当前的一个实现,只需编写下一个类似的内容:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(request->
request.requestMatchers("/actuator/**").permitAll()
.anyRequest().permitAll()
);
return http.build();
}
也不要忘记在
application.yml
文件中声明下一个配置:
management:
endpoints:
web:
exposure:
include: "health,info"
它将解决您的问题。
如果您无法找出问题所在,我可以通过从我的
spring.mvc.servlet.path=
文件中删除 application.properties
来解决该问题。显然,从 Spring Boot 3.1.6 开始,Spring Security 不再忽略 servlet 路径。我想您也可以重写匹配器以包含 servlet 路径,但我还没有尝试过。