CHAPITRE 11 : CONFIGURATION, PROFILS ET SECURITE

Une application ne tourne pas de la meme facon sur votre machine et en production. Les profils permettent de gerer ces differences sans jamais modifier le code.

1. Les profils

Creez un fichier par environnement :

src/main/resources/
├── application.properties          commun a tous
├── application-dev.properties      developpement
└── application-prod.properties     production
# application.properties
spring.application.name=gestion-etudiants
spring.profiles.active=dev
# application-dev.properties
spring.datasource.url=jdbc:h2:mem:ecole
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
logging.level.root=DEBUG
# application-prod.properties
spring.datasource.url=${DB_URL}
spring.datasource.username=${DB_USER}
spring.datasource.password=${DB_PASSWORD}
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.show-sql=false
logging.level.root=WARN

Activer un profil

java -jar app.jar --spring.profiles.active=prod

# ou par variable d'environnement
export SPRING_PROFILES_ACTIVE=prod

2. Du code conditionnel

@Configuration
@Profile("dev")
public class DonneesDeTest {

    @Bean
    CommandLineRunner initialiser(EtudiantRepository repository) {
        return args -> {
            repository.save(new Etudiant("Awa Ngono", "19A123", 15.5));
            repository.save(new Etudiant("Brice Fotso", "19A124", 9.0));
        };
    }
}

Ce jeu de donnees ne sera cree qu'en developpement.

3. Ne jamais versionner un secret

Un mot de passe ecrit en clair dans application.properties, puis pousse sur un depot, est un incident de securite : meme sur un depot prive, car l'historique Git le conserve indefiniment.

# a eviter
spring.datasource.password=MonMotDePasse123

# correct : lu dans l'environnement
spring.datasource.password=${DB_PASSWORD}

Ajoutez aussi les fichiers locaux a votre .gitignore :

application-local.properties
*.env

4. Proteger l'API

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

Des l'ajout de cette dependance, toutes vos routes sont protegees et un mot de passe temporaire s'affiche dans la console. C'est voulu : securise par defaut.

5. Une configuration de base

@Configuration
@EnableWebSecurity
public class ConfigurationSecurite {

    @Bean
    SecurityFilterChain filtres(HttpSecurity http) throws Exception {

        http
            .csrf(csrf -> csrf.disable())          // API sans session
            .authorizeHttpRequests(auth -> auth
                .requestMatchers(HttpMethod.GET, "/api/etudiants/**").permitAll()
                .requestMatchers("/api/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
            )
            .httpBasic(Customizer.withDefaults());

        return http.build();
    }

    @Bean
    PasswordEncoder encodeurMotDePasse() {
        return new BCryptPasswordEncoder();
    }
}

L'ordre des regles compte : Spring applique la premiere qui correspond. Placez toujours les regles les plus specifiques en premier.

6. Toujours chiffrer les mots de passe

@Service
public class UtilisateurService {

    private final PasswordEncoder encodeur;

    public Utilisateur creer(String nom, String motDePasse) {
        Utilisateur u = new Utilisateur(nom, encodeur.encode(motDePasse));
        return repository.save(u);
    }
}

Un mot de passe ne se stocke jamais en clair. BCrypt ajoute automatiquement un sel et reste resistant aux attaques par force brute.

7. Le CORS

Si un front Angular appelle votre API depuis un autre port, le navigateur bloque la requete. Il faut l'autoriser explicitement :

@Bean
CorsConfigurationSource configurationCors() {

    CorsConfiguration config = new CorsConfiguration();
    config.setAllowedOrigins(List.of("http://localhost:4200"));
    config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE"));
    config.setAllowedHeaders(List.of("*"));

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", config);

    return source;
}

N'autorisez jamais * en production : enumerez les origines reellement attendues.

A retenir

  • Un profil par environnement, active au lancement
  • Les secrets passent par des variables d'environnement
  • Spring Security protege tout par defaut
  • L'ordre des regles de securite est determinant
  • BCrypt pour les mots de passe, toujours

Exercices d'application

Exercice 1. Deux profilsCreez les profils dev (H2, logs verbeux) et prod (MySQL, logs discrets). Lancez l'application avec chacun et observez la difference.
Exercice 2. Jeu de donneesEcrivez un CommandLineRunner annote @Profile("dev") qui cree cinq etudiants au demarrage.
Exercice 3. SecuriserAjoutez Spring Security : laissez les GET publics, protegez les POST et DELETE. Testez avec curl -u utilisateur:motdepasse.

Cherchez avant de regarder la solution : c'est en butant sur les difficultes que l'on progresse.

Questions / Réponses

Aucune question. Soyez le premier à poser une question.
★ ★ ★ ★ ★
2 votes. Moyenne 5 sur 5.

Ajouter un commentaire

Anti-spam