/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 :
- `names` : Liste des préfixes de configuration (ex: `app`, `server`).
- 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 :
- Vérifier que le bean est annoté `@ConfigurationProperties`
- Confirmer que le préfixe dans `@ConfigurationProperties` correspond à la propriété configurée
- Utiliser `@ConstructorBinding` pour les alternatives immuables (Spring Boot 2.3+)
Problème : Valeur par défaut non affichée
Solutions :
- Utiliser `@ConfigurationProperties(defaultValue = …)` (Spring Boot 2.4+)
- 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\": { ... } }}