Skip to content

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 @Configuration et @EnableWebSecurity
@Configuration
@EnableWebSecurity
public class ConfigurationSecurite {
    ...
}

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é authorizeHttpRequests de l'objet HttpSecurity.
  • 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

.logout(logout -> logout
            // Url qui gère la déconnexion
            .logoutUrl("/logout")
            .permitAll()
            // Vers où redirige après la déconnexion
            .logoutSuccessUrl("/login")
        )