我将 HealthIndicator 实现到 Spring Boot 应用程序(执行器 2.5.1)并尝试稍微调整设置。不幸的是,文档没有“明确”说明默认值。当我挖掘它们时……我会经历不同的行为。 您能指出这是否是误解/错误配置/错误吗?谢谢。
如何设置执行器以允许匿名调用两个端点:
/actuator/health
和/actuator/health/custom
,并具有简单的响应(没有详细信息或组件)。两个端点都会返回经过身份验证(和授权)请求的完整详细信息。
不幸的是,Spring Security 配置使情况变得复杂...... 我有两个瞄准镜
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
...
return Health
.status(...)
.withDetail("detailDto", detailDto)
.build();
}
}
默认配置文档 management.endpoint.health.show-details=从不
/actuator/health 的预期响应
{"status":"DOWN"}
BUG?:真正的响应是带有详细信息(同样默认值:从不)
{
"status": "DOWN",
"components": {
"blobStorage": {
"status": "DOWN",
"details": ...
},
"diskSpace": {
"status": "UP",
"details": ...
},
"custom": {
"status": "UP",
"details": ...
},
"ping": {
"status": "UP"
}
}
}
/actuator/health/custom 的预期响应没有详细信息,但实际响应有详细信息。 在我看来,默认配置中可访问的详细信息是一个BUG。
management.endpoint.health.show-details=when-authorized
预期的行为是,因为我没有向 /actuator/** 添加安全性。任何请求都将被视为未经授权的处理,因此它应该返回没有详细信息的 json。
/actuator/health
的真实响应符合预期 - 只是状态:{"status":"DOWN"}
。但 /actuator/health/custom
的真正响应是 HTTP 404 NOT FOUND ?!?为什么整个自定义运行状况端点被禁用?如果有的话,我会期望 HTTP 401 UNAUTHENTICATED。 看起来像一个BUG。无论如何,我预计/actuator/health/custom
会起作用,但没有细节:
{"status":"DOWN"}
management.endpoint.health.show-components=when-authorized
management.endpoint.health.show-details=when-authorized
并为
/actuator/**
添加安全性
@Configuration
@Order(3)
public static class ActuatorSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
...
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/actuator/**")
.authorizeRequests(authorize -> authorize
.anyRequest().permitAll()
)
.httpBasic();
// ?????
}
}
Endpoints
/actuator/health
返回 {"status":"DOWN"}
,以获取预期的经过身份验证的请求的匿名和完整详细信息。但端点 /actuator/health/custom
仍然仅适用于经过身份验证的请求。对于匿名调用,它会返回 404 NOT FOUND。我不知道如何正确设置安全性,如文档中所述:
如果您已保护应用程序并希望始终使用,则您的安全配置必须允许“经过身份验证和未经身份验证”的用户访问运行状况端点。
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatcher("/actuator/**")
.permitAll()
.anyRequest().authenticated()
.and()
...
}
builder.build().getStatus() OR
builder.build().getStatus().getCode()
我通常这样做,而不是获取所有细节。
还保留这样的属性:
management:
endpoint:
health:
sensitive: false
show-details: never
dependency-health-check:
enabled: false
diskspace:
enabled: false
details:
enabled: false
application:
enabled: true
when_authorized
而不是
when-authorized
。