Come disabilitare i reindirizzamenti di logout di Spring Security

1. Panoramica

In questo breve tutorial, daremo uno sguardo da vicino a come disabilitare i reindirizzamenti di logout in Spring Security .

Inizieremo prima con un breve background su come funziona il flusso di logout in Spring Security. Quindi, illustreremo, attraverso un esempio pratico, come evitare il reindirizzamento dell'utente dopo un logout riuscito.

2. Esci in Spring Security

In breve, Spring Security fornisce un supporto immediato per il meccanismo di logout tramite il metodo DSL logout () . Fondamentalmente, Spring Security attiva il logout quando un utente raggiunge l'URL di logout predefinito che è / logout .

Vale la pena ricordare che il valore predefinito dell'URL di logout era / j_spring_security_logout prima di Spring Security 4 .

Spring Security offre la possibilità di reindirizzare gli utenti a un particolare URL dopo il logout. Tuttavia, ci sono alcune occasioni in cui vogliamo evitare questo comportamento.

Quindi, senza ulteriori indugi, vediamo come implementare la logica di disabilitazione dei reindirizzamenti di logout in Spring Security .

3. Disabilitare Spring Security Logout Redirect

Per impostazione predefinita, Spring Security reindirizza gli utenti a / login? Logout dopo un logout riuscito. Quindi, in questa sezione, ci concentreremo su come impedire il reindirizzamento dell'utente alla pagina di accesso dopo il logout.

Tieni presente che possiamo sovrascrivere l'URL di reindirizzamento predefinito con l'aiuto del metodo DSL logoutSuccessUrl () .

Il punto principale qui è mostrare come evitare il reindirizzamento quando l' URL / logout viene chiamato da un client REST.

È un dato di fatto, l' interfaccia Log outSuccessHandler offre un modo flessibile per eseguire la logica personalizzata quando il processo di logout viene eseguito correttamente.

Quindi qui, useremo un LogoutSuccessHandler personalizzato per restituire solo un codice di stato 200 pulito . In questo modo, non ci reindirizzerà a nessuna pagina.

Ora implementiamo la configurazione Spring Security necessaria per disabilitare i reindirizzamenti di logout:

@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 parte importante da notare dalla configurazione precedente è il metodo logoutSuccessHandler () . Come possiamo vedere, usiamo un'espressione lambda per definire il nostro gestore di successo del logout personalizzato.

Tieni presente che possiamo anche creare una semplice classe di implementazione dell'interfaccia LogoutSuccessHandler e utilizzare DSL per passarla al metodo logoutSuccessHandler () .

4. Test

Ora che abbiamo messo insieme tutti i pezzi, testiamo l' endpoint / logout per confermare che tutto funzioni come previsto.

Nota che utilizzeremo MockMvc per inviare / disconnettere la richiesta nel nostro test.

Per prima cosa, creiamo una semplice classe di test e inseriamo l' oggetto MockMvc al suo interno:

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

Ora, scriviamo un metodo per testare il nostro endpoint / logout :

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

Infine, proviamo a scomporre il nostro codice di test:

  • perform (post ("/ logout")) richiama l' endpoint / logout come una semplice richiesta POST
  • con (csrf ()) aggiunge il parametro _csrf previsto alla query
  • status () restituisce il codice di stato della risposta HTTP
  • jsonPath () consente di accedere e ispezionare il corpo della risposta HTTP

5. conclusione

Per riassumere, abbiamo spiegato e illustrato come affrontare la sfida della disabilitazione dei reindirizzamenti di logout in Spring Security e Spring Boot.

Come al solito, il codice sorgente completo di questo articolo è disponibile su GitHub.