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.
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.
/ info et / health sont publiés par défautCela 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
/ infoet/ 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(xxxxxest le nom du point final)
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 ʻEndpointRequestdu 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"
}
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