Logout manuale con Spring Security

1. Introduzione

Spring Security è lo standard per la protezione delle applicazioni basate su Spring. Ha diverse funzionalità per gestire l'autenticazione dell'utente, inclusi login e logout.

In questo tutorial, ci concentreremo sul logout manuale con Spring Security.

Daremo per scontato che i lettori comprendano già il processo di disconnessione standard di Spring Security.

2. Logout di base

Quando un utente tenta di disconnettersi, ha diverse conseguenze sullo stato della sessione corrente . Dobbiamo distruggere la sessione con due passaggi:

  1. Invalidare le informazioni sulla sessione HTTP.
  2. Cancella SecurityContext poiché contiene le informazioni di autenticazione.

Queste due azioni vengono eseguite da SecurityContextLogoutHandler.

Vediamolo in azione:

@Configuration public class DefaultLogoutConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .logout(logout -> logout .logoutUrl("/basic/basiclogout") .addLogoutHandler(new SecurityContextLogoutHandler()) ); } }

Nota che SecurityContextLogoutHandler viene aggiunto da Spring Security per impostazione predefinita: lo mostriamo qui solo per chiarezza.

3. Cancellazione dei cookie Logout

Spesso, un logout richiede anche di cancellare alcuni o tutti i cookie di un utente.

Possiamo creare il nostro LogoutHandler che scorre tutti i cookie e li fa scadere al logout:

@Configuration public class AllCookieClearingLogoutConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .logout(logout -> logout .logoutUrl("/cookies/cookielogout") .addLogoutHandler((request, response, auth) -> { for (Cookie cookie : request.getCookies()) { String cookieName = cookie.getName(); Cookie cookieToDelete = new Cookie(cookieName, null); cookieToDelete.setMaxAge(0); response.addCookie(cookieToDelete); } }) ); } }

D'altra parte, Spring Security fornisce CookieClearingLogoutHandler che è un gestore di logout pronto per l'uso per la rimozione dei cookie.

4. Logout intestazione Clear-Site-Data

In alternativa, possiamo utilizzare una speciale intestazione di risposta HTTP per ottenere la stessa cosa; è qui che entra in gioco l' intestazione Clear-Site-Data . L' intestazione Clear-Data-Site cancella i dati di navigazione (cookie, archiviazione, cache) associati al sito Web richiedente:

@Configuration public class ClearSiteDataHeaderLogoutConfiguration extends WebSecurityConfigurerAdapter { private static final ClearSiteDataHeaderWriter.Directive[] SOURCE = {CACHE, COOKIES, STORAGE, EXECUTION_CONTEXTS}; @Override protected void configure(HttpSecurity http) throws Exception { http .logout(logout -> logout .logoutUrl("/csd/csdlogout") .addLogoutHandler(new HeaderWriterLogoutHandler(new ClearSiteDataHeaderWriter(SOURCE))) ); } }

Tieni presente che la pulizia della memoria potrebbe danneggiare lo stato dell'applicazione quando cancelliamo solo un tipo di memoria. Pertanto, a causa della cancellazione incompleta, l'intestazione viene applicata solo se la richiesta è sicura.

5. conclusione

Spring Security ha molte funzionalità integrate per gestire gli scenari di autenticazione. È sempre utile padroneggiare come utilizzare queste funzionalità a livello di programmazione.

Come sempre, il codice per questi esempi è disponibile su GitHub.