如何在Spring Boot Actuator中启用所有端点

2023/05/11

1. 概述

在本教程中,我们学习如何在Spring Boot Actuator中启用所有端点,看看如何通过我们的属性文件来控制我们的端点。最后,我们将概述如何保护我们的端点。

就Actuator端点的配置方式而言,Spring Boot 1.x和Spring Boot 2.x之间发生了一些变化。

2. 设置

为了使用Actuator,我们需要在我们的Maven配置中包含spring-boot-starter-actuator

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    <version>2.5.1</version>
</dependency>

此外,从Spring Boot 2.0开始,如果我们希望通过HTTP公开端点,我们需要包含web starter

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.5.1</version>
</dependency>

3. 启用和公开端点

从Spring Boot 2开始,我们必须启用并公开我们的端点。默认情况下,启用除/shutdown之外的所有端点,并且仅公开/health和/info。所有端点都可以在/actuator中找到,即使我们为应用程序配置了不同的根上下文也是如此。

这意味着一旦我们将适当的starter依赖项添加到我们的Maven配置中,我们就可以在http://localhost:8080/actuator/health和http://localhost:8080/actuator/info访问/health和/info端点。

让我们访问http://localhost:8080/actuator并查看可用端点列表,因为Actuator端点已启用HATEOS,我们应该看到/health和/info。

{
    "_links": {
        "self": {
            "href": "http://localhost:8080/actuator",
            "templated": false
        },
        "health": {
            "href": "http://localhost:8080/actuator/health",
            "templated": false
        },
        "info": {
            "href": "http://localhost:8080/actuator/info",
            "templated": false
        }
    }
}

3.1 公开所有端点

现在,让我们通过修改application.properties文件来公开除/shutdown之外的所有端点:

management.endpoints.web.exposure.include=*

重新启动我们的服务器并再次访问/actuator端点,我们应该看到除/shutdown之外的其他可用端点:

{
    "_links": {
        "self": {
            "href": "http://localhost:8080/actuator",
            "templated": false
        },
        "beans": {
            "href": "http://localhost:8080/actuator/beans",
            "templated": false
        },
        "caches": {
            "href": "http://localhost:8080/actuator/caches",
            "templated": false
        },
        "health": {
            "href": "http://localhost:8080/actuator/health",
            "templated": false
        },
        "info": {
            "href": "http://localhost:8080/actuator/info",
            "templated": false
        },
        "conditions": {
            "href": "http://localhost:8080/actuator/conditions",
            "templated": false
        },
        "configprops": {
            "href": "http://localhost:8080/actuator/configprops",
            "templated": false
        },
        "env": {
            "href": "http://localhost:8080/actuator/env",
            "templated": false
        },
        "loggers": {
            "href": "http://localhost:8080/actuator/loggers",
            "templated": false
        },
        "heapdump": {
            "href": "http://localhost:8080/actuator/heapdump",
            "templated": false
        },
        "threaddump": {
            "href": "http://localhost:8080/actuator/threaddump",
            "templated": false
        },
        "metrics": {
            "href": "http://localhost:8080/actuator/metrics",
            "templated": false
        },
        "scheduledtasks": {
            "href": "http://localhost:8080/actuator/scheduledtasks",
            "templated": false
        },
        "mappings": {
            "href": "http://localhost:8080/actuator/mappings",
            "templated": false
        }
    }
}

3.2 公开特定端点

某些端点可能会暴露敏感数据,因此让我们了解如何更加细化我们暴露的端点。

management.endpoints.web.exposure.include属性也可以采用逗号分隔的端点列表。所以,让我们只公开/beans和/loggers:

management.endpoints.web.exposure.include=beans,loggers

除了在属性中包含某些端点之外,我们还可以排除端点。下面我们公开除/threaddump之外的所有端点:

management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=threaddump

include和exclude属性都接收端点列表,exclude属性优先于include

3.3 启用特定端点

接下来,让我们了解如何更细粒度地了解我们启用了哪些端点。

首先,我们需要关闭启用所有端点的默认值:

management.endpoints.enabled-by-default=false

接下来,让我们只启用和公开/health端点:

management.endpoint.health.enabled=true
management.endpoints.web.exposure.include=health

使用此配置,我们只能访问/health端点。

3.4 启用shutdown端点

由于其敏感性,/shutdown端点默认处于禁用状态

现在让我们通过在application.properties文件中添加一行来启用它:

management.endpoint.shutdown.enabled=true

现在,当我们调用/actuator端点时,我们应该会看到它已列出。/shutdown端点只接受POST请求,所以让我们优雅地关闭我们的应用程序:

curl -X POST http://localhost:8080/actuator/shutdown

4. 保护端点

在实际应用程序中,我们很可能会对应用程序添加安全性。考虑到这一点,让我们保护我们的Actuator端点。

首先,我们通过添加security starter Maven依赖项来为我们的应用程序添加安全性:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>2.5.1</version>
</dependency>

对于最基本的安全性,这就是我们所要做的。只需添加security starter,我们就自动将基本身份验证应用于除/info和/health之外的所有公开端点。

现在,让我们自定义我们的安全性以将/actuator端点限制为ADMIN角色。

首先从排除默认安全配置开始:

@SpringBootApplication(exclude = { 
    SecurityAutoConfiguration.class, 
    ManagementWebSecurityAutoConfiguration.class 
})

注意ManagementWebSecurityAutoConfiguration.class,因为这会允许我们将我们自己的安全配置应用到/actuator。

在我们的配置类中,让我们配置几个用户和角色,以便我们有一个ADMIN角色可以使用:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
    auth.inMemoryAuthentication()
        .withUser("user")
        .password(encoder.encode("password"))
        .roles("USER")
        .and()
        .withUser("admin")
        .password(encoder.encode("admin"))
        .roles("USER", "ADMIN");
}

Spring Boot为我们提供了一个方便的请求匹配器,用于我们的Actuator端点。

让我们用它来将/actuator锁定为仅ADMIN角色:

http.requestMatcher(EndpointRequest.toAnyEndpoint())
    .authorizeRequests((requests) -> requests.anyRequest().hasRole("ADMIN"));

5. 总结

在本教程中,我们学习了Spring Boot默认情况下如何配置Actuator。之后,我们在application.properties文件中自定义启用、禁用和公开的端点。由于Spring Boot默认以不同方式配置/shutdown端点,因此我们学习了如何单独启用它。

在学习了基础知识之后,我们接下来学习了如何配置Actuator安全性。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章