当前位置: 首页 > 知识库问答 >
问题:

Spring启动执行器健康指示灯在授权安全时显示详细信息

宋昕
2023-03-14

我在spring boot应用程序(actuator 2.5.1)中实现了HealthIndicator,并尝试稍微调整一下设置。遗憾的是,文档并没有“清楚”地说明默认值。当我挖的时候。。。我经历了不同的行为。你能告诉我这是否是误解/配置错误/错误吗?非常感谢。

如何设置执行器以允许匿名调用两个endpoint:/actuator/health/actuator/health/custom,并具有简单的响应(无详细信息或组件)。两个endpoint都返回经过身份验证(和授权)的请求的完整详细信息。

不幸的是,Spring Security配置使情况变得复杂。。。我有两个示波器

  • /api/**用于JWT auth的SPA应用
@Component
public class CustomHealthIndicator implements HealthIndicator {
    @Override
    public Health health() {
        ...
        return Health
            .status(...)
            .withDetail("detailDto", detailDto)
            .build();
    }
}

默认配置文档管理。endpoint。健康显示详细信息=从不

/actuator/health的预期反应

{“status”:“DOWN”}

缺陷?:真正的响应是细节(agains默认值:never)

{
  "status": "DOWN",
  "components": {
    "blobStorage": {
      "status": "DOWN",
      "details": ...
    },
    "diskSpace": {
      "status": "UP",
      "details": ...
    },
    "custom": {
      "status": "UP",
      "details": ...
    },
    "ping": {
      "status": "UP"
    }
  }
}

/actuator/health/custom的预期响应是没有细节的,但是真正的响应是有细节的。在默认配置中可以访问这些细节,在我看来是一个错误。

management.endpoint.health.show-details=when-authorized

预期的行为是,因为我没有向/actuator/**添加安全性。任何请求都将被视为未经授权的,因此它应该返回json而不提供详细信息。执行器/健康的实际响应与预期一致-仅状态:{“状态”:“下降”}。但HTTP 404没有找到吗?!?为什么禁用整个自定义健康endpoint?如果有的话,我希望HTTP 401未经验证。看起来像个虫子。无论如何,我希望执行器/健康/自定义能够正常工作,但没有细节:{“status”:“DOWN”}

management.endpoint.health.show-components=when-authorized
management.endpoint.health.show-details=when-authorized

并为执行器增加安全性

    @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();
                    // ?????
        }
    }

endpoint按预期返回认证请求的匿名和完整详细信息。但是endpoint仍然只适用于经过身份验证的请求。对于匿名调用,它返回404 NOT FOUND。我不知道如何正确设置文档中提到的安全性:

如果您已经保护了应用程序并希望始终使用,那么您的安全配置必须允许经过身份验证和未经身份验证的用户访问健康endpoint。


共有2个答案

诸葛阳成
2023-03-14

只返回这个并检查状态:

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
南宫森
2023-03-14

授予对所有执行器内endpoint的访问权限:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatcher("/actuator/**")
                .permitAll()
                .anyRequest().authenticated()
                .and()
                ...
    }
 类似资料:
  • 我们已经在几个项目中使用了Spring Boot,现在我们使用的是最新版本1.2.3。我们正在合并执行器。到目前为止,一切都很顺利,只是我们发现/health指示器[default]显示服务已关闭。事实并非如此。这些服务是通过数据源实现的。它可以调用其他SOAP或Rest服务。卫生服务部门在看什么来衡量一项服务是否下降?

  • 我用的是执行器上的Spring引导健康指示器。到目前为止,示例响应如下所示: 因为我需要将endpoint公之于众,所以我需要隐藏健康指标的详细信息,所以我希望得到如下内容:

  • 您可以将许多自定义运行状况指示器添加到Spring boot的执行器中,这非常棒,因为它们的总状态被认为是您的应用程序的运行状况。 有没有可能只查询其中一个指标呢? 对于一个复杂的应用程序,我有大约10个指示器来告诉我的应用程序总体运行状况,整个检查大约需要20秒。 有一些指标我想更频繁地点击,因为它们提供了对高吞吐量组件的快速响应。有可能以某种方式查询单个指标吗?

  • 我相信几乎所有的教程都在互联网上,读了很多这样的答案,但我仍然卡住了。

  • 我有一个基于SpringBoot的web应用程序,它公开了一个Consult health indicator bean。 该bean由SpringBoot的autoconfiguration正确创建和初始化,但是,尽管关联的配置属性“Management.health.consul.Enabled”设置为true,但指示器并未显示在执行器健康endpoint中: 经过进一步检查,我发现了负责获取

  • 我正在尝试配置执行器的健康探测器,以包括对嵌套在第一级之外的外部服务的检查。例如,当调用/执行器/健康时,以下是可用的健康指标: 在jms组件下,有两个代理——broker1和broker2。我可以将执行器配置为将jms包括在就绪组中,如: 但是,这将包括准备调查中的所有经纪人。 当呼叫 /actuator/health/readiness,我得到: 由于Kubernetes中的就绪性探测只会阻止