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
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 :
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 :
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.