[JAVA] Actionneur Spring Boot 2.0, 3 changements à connaître pour le faire fonctionner

Il n'est pas exagéré de dire qu'Actuator est la fonctionnalité la plus modifiée de Spring Boot 2.0. Si vous augmentez les détails, il n'y aura pas d'arêtes vives, donc pour le moment, voici quelques points à prendre en compte lors de la migration depuis 1.x.

Le préfixe d'URL est ajouté par défaut

L'erreur la plus courante dans Actuator lors de la mise à niveau d'une application existante faite avec Boot 1.x vers 2.0 est "404 Not Found" (du moins je l'ai fait). En fait, depuis 2.0, tous les points de terminaison de l'actionneur ont été préfixés par «/ actionneur». En d'autres termes, l'URL qui était précédemment spécifiée comme «localhost: 8080 / info» doit être remplacée par «localhost: 8080 / actuator / info».

Ce préfixe peut être modifié avec les propriétés suivantes.

application.Exemples de propriétés


#La valeur par défaut est"/actuator"
management.endpoints.web.base-path=/admin

Vous pouvez également modifier le numéro de port du point de terminaison de l'actionneur et ajouter un chemin de contexte. Veuillez noter que si vous ne spécifiez pas le numéro de port, le chemin du contexte ne sera pas joint.

application.Exemples de propriétés


management.server.port=9999
management.server.servlet.context-path=/admin-context

En d'autres termes, si vous écrivez les trois paramètres ci-dessus, le point de terminaison de l'actionneur sera quelque chose comme localhost: 9999 / admin-context / admin / info.

Seuls / info et / health sont publiés par défaut

Cela provoque également une erreur 404. / env, / beans, etc. ne sont pas publiés par défaut. Définissez le point de terminaison que vous souhaitez publier comme suit.

application.Exemples de propriétés


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

Si vous en spécifiez ne serait-ce qu'une seule, elle ne sera publiée que si vous spécifiez explicitement / info et / health.

Spécifiez «*» si vous souhaitez publier tous les points de terminaison.

application.Exemples de propriétés


management.endpoints.web.exposure.include=*

Inversement, les points de terminaison qui ne sont pas exposés sont spécifiés dans management.endpoints.web.exposure.exclude. Par exemple, si vous écrivez comme suit, tous les points de terminaison sauf / env et / info seront publiés.

application.Exemples de propriétés


management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,info

Les points de terminaison configurés pour publier mais qui ne sont pas activés individuellement ne seront pas publiés. Par exemple, si vous écrivez comme suit, seuls / beans et / health seront publiés. Bien que / auditevents soit spécifié comme public, il ne sera pas publié car il a été désactivé.

application.Exemples de propriétés


management.endpoints.web.exposure.include=auditevents,beans,health
# /auditevents sont désactivés et ne seront pas publiés
management.endpoint.auditevents.enabled=false

Chaque point final peut être activé avec management.endpoint.xxxxx.enabled ( xxxxx est le nom du point final)

Non protégé par défaut

Depuis Spring Boot 1.5, les points de terminaison sensibles de l'actionneur ont été protégés (seuls les utilisateurs avec le rôle ʻACTUATOR` peuvent y accéder).

Avec Spring Boot 2.0, le concept de sensible a disparu en premier lieu, et tous les points de terminaison accessibles au public ne sont plus protégés. Pour sécuriser le point de terminaison, vous devez explicitement inclure Spring Security et écrire les paramètres de sécurité dans Java Config.

pom.xml


...
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--Ajout de Spring Security!-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        ...
    </dependencies>
...

Exemple JavaConfig


@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //Créez des utilisateurs généraux et des utilisateurs pour accéder à l'actionneur
        //(Le nom d'utilisateur, le mot de passe, le nom du rôle sont facultatifs)
        auth.inMemoryAuthentication()
                .passwordEncoder(NoOpPasswordEncoder.getInstance()) //NoOpPasswordEncoder est interdit en production!
                .withUser("actuator").password("password").roles("ACTUATOR").and()
                .withUser("user").password("password").roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //Activer l'authentification BASIC
        http.httpBasic();
        //Les extrémités de l'actionneur ne sont accessibles que par le rôle ACTUATOR,
        //Les autres sont accessibles par n'importe quel rôle tant que vous êtes connecté
        http.authorizeRequests()
                .requestMatchers(EndpointRequest.toAnyEndpoint()).hasRole("ACTUATOR")
                .anyRequest().authenticated();

        //Ne désactivez pas CSRF en production!
        http.csrf().disable();
    }
}

Notez qu'il existe deux classes ʻEndpointRequest, une pour les servlets et une pour les réactifs. Puisque nous supposons une base de servlet cette fois, veuillez utiliser la classe ʻEndpointRequest du package ʻorg.springframework.boot.actuate.autoconfigure.security.servlet`.

Exemple d'accès avec curl


$ curl -v -u actuator:password localhost:8080/actuator/health | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
* Server auth using Basic with user 'actuator'
> GET /actuator/health HTTP/1.1
> Host: localhost:8080
> Authorization: Basic YWN0dWF0b3I6cGFzc3dvcmQ=
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200
< Set-Cookie: JSESSIONID=C472F3844F17FC8EBC779A35DEFB085F; Path=/; HttpOnly
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Fri, 09 Mar 2018 07:03:55 GMT
<
{ [20 bytes data]
100    15    0    15    0     0    165      0 --:--:-- --:--:-- --:--:--   166
* Connection #0 to host localhost left intact
{
  "status": "UP"
}

finalement

Si vous faites attention aux trois points ci-dessus, vous devriez être en mesure de mettre à niveau l'application créée dans 1.x vers 2.0 et de l'exécuter pour le moment. Cependant, il y a beaucoup d'autres changements dans Actuator, alors assurez-vous de lire le chapitre Actuator dans la documentation officielle! https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready.html J'aimerais écrire un blog de commentaires à ce sujet ... eh bien, attendez patiemment!

Recommended Posts

Actionneur Spring Boot 2.0, 3 changements à connaître pour le faire fonctionner
Modifications lors de la migration de Spring Boot 1.5 vers Spring Boot 2.0
Modifications lors de la migration de Spring Boot 2.0 vers Spring Boot 2.2
[Spring Boot] Si vous utilisez Spring Boot, il était pratique d'utiliser de nombreux utilitaires.
Si vous souhaitez séparer le traitement Spring Boot + Thymeleaf
Jusqu'à ce que vous créiez un projet Spring Boot dans Intellij et que vous le transmettiez à Github
[IOS] Ce que vous devez savoir avant de créer un widget
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
Essayez Spring Boot de 0 à 100.
Démarrez avec Spring Boot
Introduction à Spring Boot ① ~ DI ~
Introduction à Spring Boot ② ~ AOP ~
Changements majeurs dans Spring Boot 1.5
Introduction à Spring Boot, partie 1
Modifier le message de validation Spring Boot
Si vous en avez assez de "Spring Boot", pourquoi ne pas essayer "jooby"?
Comment configurer Spring Boot + PostgreSQL
Spring Boot Actuator valeur de métrique logback_events_total
Obtenez des résultats de validation avec Spring Boot
Comment utiliser ModelMapper (Spring boot)
Mise à niveau de la botte à ressort de la série 1.5 à la série 2.0
A vous qui avez absolument besoin de retour en arrière
Comment appliquer immédiatement les modifications de Thymeleaf au navigateur avec #Spring Boot + maven
[Spring Boot Actuator] Comment enregistrer manuellement votre propre processus de vérification de l'état