Spring Boot执行器运行状况指示器在授权+安全时显示详细信息

问题描述 投票:0回答:3

我将 HealthIndicator 实现到 Spring Boot 应用程序(执行器 2.5.1)并尝试稍微调整设置。不幸的是,文档没有“明确”说明默认值。当我挖掘它们时……我会经历不同的行为。 您能指出这是否是误解/错误配置/错误吗?谢谢。

问题:

如何设置执行器以允许匿名调用两个端点:

/actuator/health
/actuator/health/custom
,并具有简单的响应(没有详细信息或组件)。两个端点都会返回经过身份验证(和授权)请求的完整详细信息。

不幸的是,Spring Security 配置使情况变得复杂...... 我有两个瞄准镜

  • /api/** 用于使用 JWT 身份验证的 SPA 应用程序
  • /api2/** 用于具有基本身份验证的其他工具
  • (没有其他内容被显式处理。因此,/actuator/** 可供所有人访问)

案例1:默认配置

@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

案例2:更改配置

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"}

案例3:更改配置

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。我不知道如何正确设置安全性,如文档中所述:

如果您已保护应用程序并希望始终使用,则您的安全配置必须允许“经过身份验证和未经身份验证”的用户访问运行状况端点。

java spring-boot spring-security spring-boot-actuator
3个回答
0
投票

@Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatcher("/actuator/**") .permitAll() .anyRequest().authenticated() .and() ... }



0
投票

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



0
投票
when_authorized

而不是

when-authorized
    

© www.soinside.com 2019 - 2024. All rights reserved.