Configuration (SecurityFilterChain)
Notez bien
Pour tout ce qui a trait à la sécurité, j'aime bien créer un package nommé security et y mettre tous les fichiers de configuration qui y sont liés.
Spring utilise un filtre de sécurité pour gérer entre autres les routes qui doivent être protégées par l'authentification. Ce sera notre permière étape de configuration.
- Créez une classe nommée
ConfigurationSecurite - Ajoutez lui les décorateurs
@Configurationet@EnableWebSecurity
Ensuite on configurera la méthode securityFilterChain qui retournera un objet de type SecurityFilterChain. Cette méthode recevra en paramètre un objet de type HttpSecurity. Ceci nous permettra de configurer plusieurs éléments de sécurité différents, tel que l'ajout de jetons CSRF, des protections contre le XSS (cross site scripting) et plusieurs autre propriétés de sécurité.
Concentrons nous d'abord sur l'authorisation d'accès aux différentes routes.
- Les autorisations aux niveaux des routes se configurent grâce à la propriété
authorizeHttpRequestsde l'objetHttpSecurity. - On pourra indiquer:
- Les routes publiques
- Les routes protégées par l'authentification
- Les routes protégées par un rôle
Prenons l'exemple suivant:
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> {
// routes publiques
auth.requestMatchers(
"/home",
"/login",
"/error",
"/WEB-INF/**").permitAll();
// Routes nécéssitant d'être Admin
auth.requestMatchers("/admin/**").hasRole("ADMIN");
// Le reste des routes
auth.anyRequest().authenticated();
}
)
// Utiliser le formulaire de login par défaut de Spring
.formLogin(Customizer.withDefaults())
return http.build();
}
Remarquez l'utilisation de auth.requestMatchers() à de multiples reprises.
- On doit les déclarer les routes publiques (
.permitAll()) en premier. .hasRole()nous permet d'indiquer un rôle spécifique qui peut activer la/les route..anyRequest().authenticated()indique que toutes les routes auxquelles on n'a pas assigné un comportement au préalable ne seront atteignables que par un utilisateur authentifié.- La syntaxe
/admin/**correspondra à toutes les routes d.butant par/admin
Utiliser notre propre formulaire de connexion
Pour utiliser un formulaire de connexion personnalisé, on devra configurer la propriété formLogin
Customizer.withDefaults()nous donne la configuration par défaut de Spring (avec leur formulaire)- On peut personnaliser
- la route de connexion
- la route qui gère l'envoi du formulaire de connexion
- l'endroit où on redirige après un succès
- l'endroit où on redirige après un échec
- On devra configurer un contrôleur pour gérer les différentes routes
...
.formLogin(form -> form.loginPage("{route_pour_login}")
.defaultSuccessUrl("{route_après_succès}")
.loginProcessingUrl("{route_qui_recoit_formulaire}")
.failureUrl("{route_après_échec}")
.permitAll()
)
...
Gestion de la déconnexion
Pour permettre la déconnexion on configure la propriété logout