Handmatig uitloggen met Spring Security

1. Inleiding

Spring Security is de standaard voor het beveiligen van op Spring gebaseerde applicaties. Het heeft verschillende functies om de authenticatie van de gebruiker te beheren, inclusief inloggen en uitloggen.

In deze tutorial zullen we ons concentreren op handmatig uitloggen met Spring Security.

We gaan ervan uit dat lezers het standaard uitlogproces van Spring Security al begrijpen.

2. Basisafmelding

Wanneer een gebruiker probeert uit te loggen, heeft dit verschillende gevolgen voor de huidige sessiestatus . We moeten de sessie in twee stappen vernietigen:

  1. Ongeldige HTTP-sessie-informatie.
  2. Doorzichtig SecurityContext aangezien het authenticatie-informatie bevat.

Deze twee acties worden uitgevoerd door de SecurityContextLogoutHandler.

Laten we dat in actie zien:

@Configuration openbare klasse DefaultLogoutConfiguration breidt WebSecurityConfigurerAdapter uit {@Override beschermde ongeldige configuratie (HttpSecurity http) gooit uitzondering {http .logout (logout -> logout .logoutUrl ("/ basic / basiclogout") .addLogoutHandler (nieuw SecurityContextLogout)); }}

Let daar op SecurityContextLogoutHandler wordt standaard door Spring Security toegevoegd - we laten het hier alleen voor de duidelijkheid zien.

3. Cookie wissen Afmelden

Vaak moeten we bij het uitloggen ook enkele of alle cookies van een gebruiker wissen.

We kunnen onze eigen creëren LogoutHandler die alle cookies doorloopt en ze laat vervallen bij het uitloggen:

@Configuration openbare klasse AllCookieClearingLogoutConfiguration breidt WebSecurityConfigurerAdapter uit {@Override protected void configure (HttpSecurity http) gooit uitzondering {http .logout (logout -> logout .logoutUrl ("/ cookies / cookielogout") .addLogout - request, response, ((()) {for (Cookie cookie: request.getCookies ()) {String cookieName = cookie.getName (); Cookie cookieToDelete = nieuwe Cookie (cookieName, null); cookieToDelete.setMaxAge (0); response.addCookie (cookieToDelete);}}) ); }}

Aan de andere kant biedt Spring Security CookieClearingLogoutHandler wat een kant-en-klare afmeldingshandler is voor het verwijderen van cookies.

4. Clear-Site-Data Header Uitloggen

Als alternatief kunnen we een speciale HTTP-antwoordheader gebruiken om hetzelfde te bereiken; dit is waar de Clear-Site-Data koptekst komt in het spel. De Clear-Data-Site header wist browsegegevens (cookies, opslag, cache) die zijn gekoppeld aan de aanvragende website:

@Configuration openbare klasse ClearSiteDataHeaderLogoutConfiguration breidt WebSecurityConfigurerAdapter uit {privé statische laatste ClearSiteDataHeaderWriter.Directive [] SOURCE = {CACHE, COOKIES, OPSLAG, EXECUTION_CONTEXTS}; @Override protected void configure (HttpSecurity http) genereert uitzondering {http .logout (logout -> logout .logoutUrl ("/ csd / csdlogout") .addLogoutHandler (nieuwe HeaderWriterLogoutHandler (nieuwe ClearSiteDataHeaderWriter (SOURCE)))); }}

Houd er rekening mee dat het opschonen van opslag de applicatiestatus kan beschadigen wanneer we slechts één type opslag wissen. Daarom wordt de header vanwege Incomplete Clearing alleen toegepast als het verzoek veilig is.

5. Conclusie

Spring Security heeft veel ingebouwde functies om authenticatiescenario's af te handelen. Het is altijd handig om te leren hoe u deze functies programmatisch kunt gebruiken.

Zoals altijd is de code voor deze voorbeelden beschikbaar op GitHub.