1. Обзор
В этом руководстве мы узнаем, как включить все конечные точки в Spring Boot Actuator. Мы начнем с необходимых зависимостей Maven. Оттуда мы рассмотрим, как управлять нашими конечными точками через наши файлы свойств. Мы закончим обзором того, как защитить наши конечные точки.
Было несколько изменений между Spring Boot 1.x и Spring Boot 2.x с точки зрения настройки конечных точек привода. Мы будем отмечать их по мере их появления.
2. Настройка
Чтобы использовать актуатор, нам нужно включить spring-boot-starter-actuator
в нашу конфигурацию Maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.5.1</version>
</dependency>
Кроме того, начиная с Spring Boot 2.0, нам нужно включить веб-стартер , если мы хотим, чтобы наши конечные точки были доступны через HTTP :
<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
, даже если мы настроили другой корневой контекст для нашего приложения.
Это означает, что после того, как мы добавили соответствующие стартеры в нашу конфигурацию Maven, мы можем получить доступ к конечным точкам /health
и /info по адресу
http://localhost:8080/actuator/health
и http://localhost:8080/actuator/info.
.
Перейдем к http://localhost:8080/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. Предоставление всех конечных точек
Теперь давайте откроем все конечные точки, кроме /shutdown
, изменив наш файл application.properties :
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
по умолчанию отключена .
Давайте включим его сейчас, добавив строку в наш файл application.properties :
management.endpoint.shutdown.enabled=true
Теперь, когда мы запрашиваем конечную точку /actuator
, мы должны увидеть ее в списке. Конечная точка /shutdown
принимает только POST
- запросы , поэтому давайте изящно закроем наше приложение:
curl -X POST http://localhost:8080/actuator/shutdown
4. Защита конечных точек
В реальном приложении мы, скорее всего, будем иметь безопасность в нашем приложении. Имея это в виду, давайте защитим наши конечные точки привода.
Во-первых, давайте добавим безопасность в наше приложение, добавив зависимость запуска Maven :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.5.1</version>
</dependency>
Для самой базовой безопасности это все, что нам нужно сделать. Просто добавив стартер безопасности, мы автоматически применили базовую аутентификацию ко всем открытым конечным точкам, кроме /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");
}
SpringBoot предоставляет нам удобный механизм сопоставления запросов для использования с конечными точками наших приводов.
Давайте используем его, чтобы заблокировать наш /actuator
только для роли ADMIN :
http.requestMatcher(EndpointRequest.toAnyEndpoint())
.authorizeRequests((requests) -> requests.anyRequest().hasRole("ADMIN"));
5. Вывод
В этом руководстве мы узнали, как Spring Boot настраивает привод по умолчанию. После этого мы настроили, какие конечные точки были включены, отключены и доступны в нашем файле application.properties .
Поскольку Spring Boot по умолчанию настраивает конечную точку /shutdown
по- разному, мы научились включать ее отдельно.
Изучив основы, мы научились настраивать безопасность привода.
Как всегда, код примера доступен на GitHub .