Bonjour ! Dans la leçon précédente, nous avons configuré la politique CORS pour permettre à notre frontend React de communiquer avec notre API Spring Boot. Nous avons découvert que pour que cela fonctionne correctement, la configuration CORS doit être intégrée à Spring Security, car sa chaîne de filtres intercepte les requêtes très tôt.
Cette observation est la transition parfaite vers notre leçon du jour. Nous allons plonger au cœur de ce mécanisme puissant.
L'objectif d'aujourd'hui est de comprendre l'architecture de Spring Security basée sur une chaîne de filtres et de l'intégrer à notre projet. C'est une étape fondamentale. Une fois que vous maîtriserez ce concept, vous serez capable de personnaliser la sécurité de vos applications de manière précise et professionnelle, bien au-delà des configurations par défaut.
1. La "Magie" de l'Auto-Configuration
Commençons par une expérience simple mais révélatrice. Que se passe-t-il lorsque l'on ajoute simplement Spring Security à un projet Spring Boot ?
Comme votre expérience avec Laravel vous l'a montré, les frameworks modernes privilégient la convention sur la configuration. Spring Boot pousse ce principe très loin.
Pour voir cela en action, regardez la vidéo suivante. Elle montre comment l'ajout d'une seule dépendance transforme instantanément une API ouverte en une application sécurisée.
Sécuriser une application Spring Boot 3 avec Spring Security 6 | Authentification et Autorisations
Cette vidéo de la chaîne Autour Du Code montre l'effet immédiat de l'ajout de la dépendance spring-boot-starter-security. Vous verrez comment l'application est sécurisée par défaut et où trouver les informations de connexion initiales.
Regardez le segment de 01:28 à 05:43. Observez attentivement : L'ajout de la dépendance Maven spring-boot-starter-security. Le redémarrage de l'application et l'apparition d'un mot de passe généré automatiquement dans les logs. La tentative d'accès à l'API qui échoue désormais, exigeant une authentification. Comment utiliser l'authentification de base (Basic Auth) avec l'utilisateur user et le mot de passe généré pour regagner l'accès. Une méthode simple pour surcharger ces identifiants via le fichier application.properties.
Ce que vous venez de voir n'est pas de la magie. En ajoutant la dépendance, Spring Boot a automatiquement configuré une chaîne de filtres de sécurité par défaut. Tout comme Laravel utilise des middlewares pour traiter les requêtes HTTP, Spring Security utilise une chaîne de Filter Java Servlet. Chaque requête entrante doit désormais passer à travers cette chaîne avant d'atteindre vos @RestController.
2. L'Architecture de la Chaîne de Filtres (SecurityFilterChain)
Maintenant, levons le voile sur ce qui se passe en coulisses. Spring Security n'est pas un monolithe ; c'est une série de petits composants spécialisés et orchestrés.
Le Point d'Entrée : DelegatingFilterProxy
Quand une requête arrive sur le serveur d'application (Tomcat, par exemple), elle traverse d'abord une chaîne de filtres standard de Java Servlet. Spring Security s'insère dans cette chaîne via un filtre spécial appelé DelegatingFilterProxy. Son unique rôle est de déléguer la requête à une chaîne de filtres gérée par Spring, la SecurityFilterChain.

À l'intérieur de la SecurityFilterChain
Cette chaîne est le cœur de Spring Security. Elle est composée d'une liste ordonnée de filtres, chacun ayant une responsabilité unique. Pour mieux comprendre ces composants, l'article suivant est une excellente référence technique.
Spring Security : définition et concepts fondamentaux - Axopen
L'article "Spring Security : définition et concepts fondamentaux" d'Axopen détaille la composition de la SecurityFilterChain. Il vous aidera à visualiser les différents filtres qui la composent par défaut.
Lisez les sections "Introduction sur Spring Security", la partie expliquant comment les filtres sont ajoutés, et la section "Les différents composants de la chaîne de sécurité". Concentrez-vous sur : La confirmation que Spring Security intervient en ajoutant des filtres. Le rôle de la SecurityFilterChain. La liste des filtres par défaut (ne les mémorisez pas, mais comprenez qu'il y en a plusieurs, comme CsrfFilter, UsernamePasswordAuthenticationFilter, BasicAuthenticationFilter, etc.). L'importance cruciale de l'ordre des filtres.
Le Flux d'Authentification
Dans cette chaîne, plusieurs filtres collaborent pour authentifier un utilisateur. La vidéo suivante explique verbalement ce flux architectural. C'est un modèle essentiel à comprendre.
Sécuriser une application Spring Boot 3 avec Spring Security 6 | Authentification et Autorisations
Revenons à la vidéo d'Autour Du Code pour une explication du flux d'authentification. Elle décompose la logique en plusieurs acteurs clés.
Regardez le segment de 08:51 à 14:34. L'auteur y décrit le cheminement d'une authentification. Retenez les rôles des acteurs suivants : AuthenticationFilter : Intercepte la requête (ex: lit l'en-tête Authorization pour Basic Auth). AuthenticationManager : Le chef d'orchestre. Il reçoit la demande d'authentification du filtre. AuthenticationProvider : Un spécialiste qui sait comment valider un type spécifique d'authentification. Le manager lui délègue la tâche. UserDetailsService : Le service chargé de trouver l'utilisateur dans votre base de données (ou en mémoire pour l'instant). PasswordEncoder : Utilisé par le AuthenticationProvider pour vérifier que le mot de passe fourni correspond au hash stocké.
Ce découplage est un excellent exemple du principe de responsabilité unique (SRP). Chaque composant a un travail précis, ce qui rend le système extensible et maintenable.
3. Personnaliser la Chaîne de Sécurité
L'auto-configuration est pratique, mais pour une application réelle, nous devons définir nos propres règles. Avec les versions modernes de Spring Security, cela se fait en créant une classe de configuration et en y définissant un Bean de type SecurityFilterChain. C'est l'approche recommandée, qui remplace l'ancienne méthode d'héritage de WebSecurityConfigurerAdapter.
Voyons comment mettre cela en pratique.
Sécuriser une application Spring Boot 3 avec Spring Security 6 | Authentification et Autorisations
La dernière partie de cette vidéo vous montrera comment créer votre propre configuration de sécurité pour définir quelles routes sont publiques et lesquelles nécessitent une authentification. C'est votre premier pas dans la configuration active de Spring Security.
Regardez les segments de 05:53 à 08:51 et de 14:34 à 22:40. Concentrez-vous sur : La création d'une classe SecurityConfig annotée avec @Configuration et @EnableWebSecurity. La déclaration d'un Bean qui retourne un SecurityFilterChain. L'utilisation de l'objet HttpSecurity et de son API fluide (fluent API) pour construire la chaîne. L'utilisation de http.authorizeHttpRequests() pour commencer à définir les règles. L'utilisation de requestMatchers("/path").permitAll() pour rendre une route publique. L'utilisation de anyRequest().authenticated() pour sécuriser toutes les autres routes.
Voici un exemple de ce à quoi ressemble une configuration de base. Vous pouvez créer un package com.example.yourapp.config et y placer cette classe SecurityConfig.java.
package com.example.yourapp.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
// Puisque nous allons construire une API REST stateless pour React,
// nous désactivons la protection CSRF qui est utile pour les applications web traditionnelles.
.csrf(csrf -> csrf.disable())
// Définition des règles d'autorisation
.authorizeHttpRequests(authz -> authz
// Permettre l'accès public à des routes spécifiques (ex: login, register)
.requestMatchers("/api/auth/**").permitAll()
// Toutes les autres requêtes doivent être authentifiées
.anyRequest().authenticated()
)
// Configurer la gestion de session pour qu'elle soit stateless.
// Le serveur ne créera pas de session HTTP. Parfait pour les API REST avec JWT.
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
// .httpBasic(Customizer.withDefaults()); // Pour activer l'authentification HTTP Basic
return http.build();
}
}
En définissant ce Bean, vous dites à Spring : "Ignore ta configuration de sécurité par défaut et utilise celle-ci que je viens de construire". L'objet HttpSecurity est un builder qui vous permet d'assembler votre chaîne de filtres personnalisée de manière déclarative.
Conclusion
Félicitations ! Vous avez franchi une étape cruciale dans la maîtrise du backend avec Spring. La sécurité peut sembler intimidante, mais en comprenant son architecture, elle devient un outil puissant et flexible.
Points clés à retenir :
- Spring Security protège une application en insérant une chaîne de filtres (
SecurityFilterChain) sur le chemin de chaque requête HTTP. - L'ajout de la dépendance
spring-boot-starter-securityactive une auto-configuration sécurisée par défaut. - L'architecture d'authentification est modulaire et découplée :
Filter->AuthenticationManager->AuthenticationProvider->UserDetailsService. - La manière moderne de personnaliser la sécurité est de créer un
@Beande typeSecurityFilterChaindans une classe@Configuration. - L'objet
HttpSecurityfournit une API fluide pour construire votre chaîne de sécurité personnalisée, en définissant des règles pour les routes (requestMatchers), la gestion de session, etc.
Pour l'instant, notre configuration est très basique. Elle définit ce qui est public et ce qui est privé, mais ne propose pas de mécanisme de connexion robuste adapté à une API REST.
Dans la prochaine leçon, nous allons mettre en pratique ces connaissances pour implémenter un système d'authentification stateless basé sur les JSON Web Tokens (JWT). C'est la méthode standard pour sécuriser les API consommées par des frontends comme React. Nous créerons notre propre filtre JWT pour l'intégrer à la SecurityFilterChain.