Рубрики
Без рубрики

Как включить все конечные точки в приводе Spring Boot

Автор оригинала: Amy DeGregorio.

1. Обзор

В этом уроке мы узнаем, как включить все конечные точки в приводе Spring Boot. Мы начнем с необходимых зависимостей Maven. От

Между Spring Boot 1.x и Spring Boot 2.x произошло несколько изменений с точки зрения конфигурации конечных точек привода. Мы будем отмечать их по мере их появления.

2. Настройка

Для того, чтобы использовать привод, нам необходимо включить spring-boot-starter-привод в нашу конфигурацию Maven:


    org.springframework.boot
    spring-boot-starter-actuator
    2.4.3

Кроме того, начиная с Spring Boot 2.0, нам нужно включить web starter , если мы хотим, чтобы наши конечные точки были доступны через HTTP :


    org.springframework.boot
    spring-boot-starter-web
    2.4.3

3. Включение и отображение конечных точек

Начиная с Spring Boot 2, мы должны включить и выставить наши конечные точки . По умолчанию все конечные точки, кроме /shutdown , включены и доступны только /health и /info . Все конечные точки находятся в /приводе , даже если мы настроили другой корневой контекст для нашего приложения.

Это означает, что как только мы добавим соответствующие стартеры в нашу конфигурацию Maven, мы сможем получить доступ к конечным точкам /health и /info в http://localhost:8080/actuator/health и http://localhost:8080/actuator/info .

Давайте перейдем к http://localhost:8080/actuator и просмотрите список доступных конечных точек, поскольку конечные точки привода включены HATEOS. Мы должны увидеть /здоровье и /информацию .

{"_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=*

Как только мы перезапустим наш сервер и снова получим доступ к конечной точке /, мы должны увидеть другие доступные конечные точки, за исключением /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 также может принимать список конечных точек, разделенных запятыми. Итак, давайте выставим только /бобы и /лесорубы :

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

В дополнение к включению определенных конечных точек со свойством, мы также можем исключить конечные точки. Давайте выставим все конечные точки, кроме /дампа потока :

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

Теперь, когда мы запрашиваем конечную точку /привода , мы должны увидеть ее в списке. завершение работы/| Конечная точка принимает только POST запросы , поэтому давайте изящно завершим работу нашего приложения:

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

4. Обеспечение Безопасности Конечных Точек

В реальном приложении мы, скорее всего, будем иметь безопасность в нашем приложении. Имея это в виду, давайте обезопасим наши конечные точки привода.

Во-первых, давайте добавим безопасность в ваше приложение, добавив зависимость security starter Maven :


    org.springframework.boot
    spring-boot-starter-security
    2.4.4

Для самой элементарной безопасности это все, что нам нужно сделать. Просто добавив стартер безопасности, мы автоматически применили базовую аутентификацию ко всем открытым конечным точкам, за исключением /info и /health .

Теперь давайте настроим нашу безопасность, чтобы ограничить конечные точки /привода ролью ADMIN .

Давайте начнем с исключения конфигурации безопасности по умолчанию:

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

Давайте обратим внимание на ManagementWebSecurityAutoConfiguration.class потому что это позволит нам применить нашу собственную конфигурацию безопасности к /приводу .

В нашем классе конфигурации давайте настроим пару пользователей и ролей, чтобы у нас была роль 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 предоставляет нам удобный requestmatcher для использования в наших конечных точках привода.

Давайте используем его для блокировки нашего /привода только для роли ADMIN :

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

5. Заключение

В этом уроке мы узнали, как Spring Boot настраивает привод по умолчанию. После этого мы настроили, какие конечные точки были включены, отключены и представлены в нашем файле application.properties . Поскольку Spring Boot по умолчанию настраивает конечную точку /shutdown по-разному, мы узнали, как включить ее отдельно.

Изучив основы, мы затем узнали, как настроить безопасность привода.

Как всегда, пример кода доступен на GitHub .