high-phone

Domptez votre iPhone, sublimez votre expérience mobile

high-phone

Domptez votre iPhone, sublimez votre expérience mobile

high-phone

/actuator/configprops : Guide Complet pour Spring Boot | Inspection des Configurations

Maîtrisez l’inspection des configurations avec cet endpoint Actuator clé pour le débogage et la configuration dynamique.

Thank you for reading this post, don't forget to subscribe!

/actuator/configprops : Définition et Objectif

L’endpoint `/actuator/configprops` est un composant essentiel d’Actuator dans Spring Boot, conçu pour inspecter les propriétés de configuration liées aux objets `@ConfigurationProperties` ou aux beans Spring. Son utilité principale réside dans le débogage, la vérification des valeurs configurées et l’audit des propriétés personnalisées. En comparaison avec `/actuator/env`, cet endpoint se concentre spécifiquement sur les configurations structurées liées aux composants applicatifs.

Par exemple, si vous utilisez `@ConfigurationProperties(prefix = \ »security\ »)` pour gérer les paramètres de sécurité, cet endpoint affichera dynamiquement les valeurs comme `enabled: true` ou les sous-propriétés complexes (`auth.algorithm: JWT`). Cette visualisation simplifie considérablement le processus de validation des configurations lors du développement ou de la résolution de problèmes en production.

Activation et Configuration

Pour activer cet endpoint, ajoutez la dépendance suivante à votre `pom.xml` :

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

Configurez son exposition dans `application.properties` :

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

Important : **Sécurisez toujours cet endpoint**. Utilisez Spring Security pour restreindre l’accès :

@Configurationpublic class ActuatorSecurityConfig extends WebSecurityConfigurerAdapter {    @Override    protected void configure(HttpSecurity http) throws Exception {        http.authorizeRequests()            .antMatchers(\"/actuator/configprops\").hasRole(\"ACTUATOR\")            .anyRequest().permitAll();    }}

Structure de la Réponse JSON

La réponse est organisée en deux parties principales :

  1. `names` : Liste des préfixes de configuration (ex: `app`, `server`).
  2. Objets détaillant les propriétés pour chaque préfixe.

Exemple concret :

{  \"names\": [\"app\", \"server\"],  \"app\": {    \"prefix\": \"app\",    \"properties\": {      \"name\": \"MonApp\",      \"timeout\": 5000    }  },  \"server\": {    \"prefix\": \"server\",    \"properties\": {      \"port\": 8080,      \"contextPath\": \"/api\"    }  }}

Types de Propriétés Prise en Charge

Cet endpoint supporte à la fois des propriétés primitives, des collections, et des objets complexes :

Propriétés Primitives

(ex: `int`, `String`, `boolean`)

Collections

@ConfigurationProperties(prefix = \"cache\")public class CacheProperties {    private List nodes = new ArrayList<>();    private Map settings = new HashMap<>();}

POJOs (Objets Complexes)

Exemple avec une classe imbriquée :

@ConfigurationProperties(prefix = \"security\")public class SecurityProperties {    private boolean enabled;    private Auth auth = new Auth();    public static class Auth {        private String algorithm;        private int tokenTimeout;    }}

Réponse JSON annotée :

security: {  prefix: security,  properties: {    enabled: true,    auth: {      algorithm: JWT,      tokenTimeout: 3600    }  }}

Compatibilité avec les Configurations Spécifiques

  • Propriétés via `@Value` : Ne sont PAS affichées (seulement les `@ConfigurationProperties`).
  • Propriétés de l’environnement (ex: `spring.datasource.url`) : Affichées si liées à un `@ConfigurationProperties`.
  • Valeurs par défaut : Si une propriété est absente, sa valeur par défaut (définie dans le bean) est affichée.

Exemple avec valeur par défaut :

@ConfigurationProperties(prefix = \"cache\")public class CacheProperties {    private int maxConnections = 10; // Valeur par défaut}

Réponse : `maxConnections: 10` même si non configuré.

Personnalisation et Exclusion

Pour masquer des propriétés sensibles :

Exclure des propriétés

@ConfigurationProperties(prefix = \"app\", ignoreUnknownFields = true)public class AppProperties {    @ConfigurationProperties(ignoreInvalidFields = true)    private Security security;}

Exclure des préfixes

Dans `application.properties` :

management.endpoint.configprops.keys-exclude-pattern=.*password.*management.endpoint.configprops.keys-exclude-pattern=.*secret.*

Sécurité et Bonnes Pratiques

Risques Mesures de Sécurité
Exposition de secrets (mots de passe, clés) Ne pas exposer en production sans protection
Attaques par injection Sécuriser avec Spring Security ou firewall
Accès non autorisé Limiter l’accessibilité (ex : uniquement IPs internes)

Exemple de configuration Spring Security

@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {    http        .authorizeHttpRequests(auth -> auth            .requestMatchers(\"/actuator/configprops\").hasIpAddress(\"192.168.1.0/24\")            .anyRequest().permitAll()        );    return http.build();}

Exemple Pratique de Bean

Voici un bean `@ConfigurationProperties` complet :

@ConfigurationProperties(prefix = \"app.database\")public class DatabaseProperties {    private String url;    private String username;    private int maxConnections = 10;        // Getters and setters}

Réponse JSON simulée :

app.database: {  prefix: app.database,  properties: {    url: jdbc:mysql://localhost/db,    username: admin,    maxConnections: 10  }}

Intégration avec d’Autres Endpoints

  • Complémentaire à `/actuator/env` : – `/env` liste TOUTES les sources (environnement, YAML, etc.) – `/configprops` se concentre sur les `@ConfigurationProperties` structurées
  • Intégration avec `/actuator/mappings` : Corréler les configurations aux endpoints HTTP (ex: `server.port` affecte l’URL exposée)
  • Documentation OpenAPI : Utilisez `spring-boot-starter-actuator-docs` pour générer une spécification détaillée

Dépannage Courant

Problème : Propriété non affichée

Solutions :

  1. Vérifier que le bean est annoté `@ConfigurationProperties`
  2. Confirmer que le préfixe dans `@ConfigurationProperties` correspond à la propriété configurée
  3. Utiliser `@ConstructorBinding` pour les alternatives immuables (Spring Boot 2.3+)

Problème : Valeur par défaut non affichée

Solutions :

  1. Utiliser `@ConfigurationProperties(defaultValue = …)` (Spring Boot 2.4+)
  2. Définir une valeur par défaut dans le bean

Documentation et Extensions

  • OpenAPI : Activez le support via :
<dependency>    <groupId>org.springdoc</groupId>    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>    <version>2.1.0</version></dependency>
  • Spring Boot Admin : Intégrez `/actuator/configprops` dans l’interface utilisateur pour une visualisation simplifiée
  • Logging : Utilisez `logging.file.name` pour journaliser les configurations critiques

Exemple de Requête HTTP

Accédez à l’endpoint via :

cURL -u user:password http://localhost:8080/actuator/configprops

Exemple de réponse avec `curl` :

>>> GET /actuator/configprops200 OK{  \"names\": [\"app\", \"security\"],  \"app\": {    \"prefix\": \"app\",    \"properties\": { ... }  },  \"security\": {    \"prefix\": \"security\",    \"properties\": { ... }  }}

Synthèse des Points Clés

Aspect Détails
Principal usage Inspection des configurations via `@ConfigurationProperties`
Structure Objets JSON regroupés par préfixes
Sécurité Critique : Exposer en production ⇒ protection obligatoire
Types supportés Primitives, collections, POJOs
Exclusions `keys-exclude-pattern` ou `ignoreInvalidFields`

Utilisez `/actuator/configprops` avec prudence en production. Consultez toujours la documentation officielle pour les évolutions (https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.endpoints.rest.configprops-endpoint).