Comment désactiver les redirections de déconnexion Spring Security

1. Vue d'ensemble

Dans ce court didacticiel, nous allons examiner de près comment désactiver les redirections de déconnexion dans Spring Security .

Nous commencerons par un bref aperçu du fonctionnement du flux de déconnexion dans Spring Security. Ensuite, nous illustrerons, à travers un exemple pratique, comment éviter la redirection de l'utilisateur après une déconnexion réussie.

2. Déconnexion dans Spring Security

En bref, Spring Security fournit une prise en charge immédiate du mécanisme de déconnexion via la méthode DSL logout () . Fondamentalement, Spring Security déclenche la déconnexion lorsqu'un utilisateur atteint l'URL de déconnexion par défaut qui est / logout .

Il convient de mentionner que la valeur par défaut de l'URL de déconnexion était / j_spring_security_logout avant Spring Security 4 .

Spring Security offre la possibilité de rediriger les utilisateurs vers une URL particulière après la déconnexion. Cependant, dans certains cas, nous voulons éviter ce comportement.

Alors, sans plus tarder, voyons comment implémenter la logique de désactivation des redirections de déconnexion dans Spring Security .

3. Désactivez la redirection de déconnexion de Spring Security

Par défaut, Spring Security redirige les utilisateurs vers / login? Logout après une déconnexion réussie. Donc, dans cette section, nous allons nous concentrer sur la façon d'empêcher la redirection de l'utilisateur vers la page de connexion après la déconnexion.

Notez que nous pouvons remplacer l'URL de redirection par défaut à l'aide de la méthode DSL logoutSuccessUrl () .

Le point principal ici est de montrer comment éviter la redirection lorsque l' URL / logout est appelée à partir d'un client REST.

En fait, l' interface Log outSuccessHandler offre un moyen flexible d'exécuter une logique personnalisée lorsque le processus de déconnexion est exécuté avec succès.

Donc, ici, nous allons utiliser un LogoutSuccessHandler personnalisé pour ne renvoyer qu'un code d'état 200 propre . De cette façon, il ne nous redirigera vers aucune page.

Maintenant, implémentons la configuration Spring Security nécessaire pour désactiver les redirections de déconnexion:

@Configuration @EnableWebSecurity public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests(authz -> authz .mvcMatchers("/login").permitAll() .anyRequest().authenticated() ) .logout(logout -> logout .permitAll() .logoutSuccessHandler((request, response, authentication) -> { response.setStatus(HttpServletResponse.SC_OK); } ); } }

La partie importante à noter de la configuration ci-dessus est la méthode logoutSuccessHandler () . Comme nous pouvons le voir, nous utilisons une expression lambda pour définir notre gestionnaire de réussite de déconnexion personnalisé.

Gardez à l'esprit que nous pouvons également créer une classe d'implémentation simple de l' interface LogoutSuccessHandler et utiliser DSL pour la transmettre à la méthode logoutSuccessHandler () .

4. Test

Maintenant que nous avons rassemblé tous les éléments, testons le point de terminaison / logout pour confirmer que tout fonctionne comme prévu.

Notez que nous utiliserons MockMvc pour envoyer / déconnecter une demande dans notre test.

Tout d'abord, créons une classe de test simple et y injectons l' objet MockMvc :

public class LogoutApplicationUnitTest { @Autowired private MockMvc mockMvc; // test case }

Maintenant, écrivons une méthode pour tester notre point de terminaison / logout :

@Test public void whenLogout_thenDisableRedirect() throws Exception { this.mockMvc.perform(post("/logout").with(csrf())) .andExpect(status().isOk()) .andExpect(jsonPath("$").doesNotExist()) .andExpect(unauthenticated()) .andReturn(); }

Enfin, essayons de décomposer notre code de test:

  • perform (post («/ logout»)) appelle le point de terminaison / logout comme une simple requête POST
  • with (csrf ()) ajoute le paramètre _csrf attendu à la requête
  • status () renvoie le code d'état de la réponse HTTP
  • jsonPath () permet d'accéder et d'inspecter le corps de la réponse HTTP

5. Conclusion

Pour résumer, nous avons expliqué et illustré comment relever le défi de la désactivation des redirections de déconnexion dans Spring Security et Spring Boot.

Comme d'habitude, le code source complet de cet article est disponible à l'adresse over sur GitHub.