Manuelle Abmeldung mit Spring Security

1. Einleitung

Spring Security ist der Standard für die Sicherung von Spring-basierten Anwendungen. Es verfügt über verschiedene Funktionen zum Verwalten der Benutzerauthentifizierung, einschließlich An- und Abmelden.

In diesem Tutorial konzentrieren wir uns auf die manuelle Abmeldung mit Spring Security.

Wir gehen davon aus, dass die Leser den Standard-Abmeldevorgang für Spring Security bereits verstehen.

2. Grundlegende Abmeldung

Wenn ein Benutzer versucht, sich abzumelden, hat dies mehrere Konsequenzen für seinen aktuellen Sitzungsstatus . Wir müssen die Sitzung in zwei Schritten zerstören:

  1. Ungültige HTTP-Sitzungsinformationen.
  2. Löschen Sie SecurityContext, da es Authentifizierungsinformationen enthält.

Diese beiden Aktionen werden vom SecurityContextLogoutHandler ausgeführt.

Lassen Sie uns das in Aktion sehen:

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

Beachten Sie, dass SecurityContextLogoutHandler standardmäßig von Spring Security hinzugefügt wird. Der Übersichtlichkeit halber wird dies hier nur angezeigt.

3. Cookie Clearing Logout

Bei einer Abmeldung müssen wir häufig auch einige oder alle Cookies eines Benutzers löschen.

Wir können unseren eigenen LogoutHandler erstellen , der alle Cookies durchläuft und sie beim Abmelden abläuft:

@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); } }) ); } }

Auf der anderen Seite bietet Spring Security den CookieClearingLogoutHandler , einen gebrauchsfertigen Logout-Handler zum Entfernen von Cookies.

4. Abmelden des Site-Daten- Headers löschen

Alternativ können wir einen speziellen HTTP-Antwortheader verwenden, um dasselbe zu erreichen. Hier kommt der Clear-Site-Data- Header ins Spiel. Der Header " Clear-Data-Site" löscht Browserdaten (Cookies, Speicher, Cache), die der anfordernden Website zugeordnet sind:

@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))) ); } }

Beachten Sie, dass die Speicherbereinigung den Anwendungsstatus beschädigen kann, wenn nur ein Speichertyp gelöscht wird. Aufgrund des unvollständigen Löschens wird der Header daher nur angewendet, wenn die Anforderung sicher ist.

5. Schlussfolgerung

Spring Security verfügt über viele integrierte Funktionen zur Behandlung von Authentifizierungsszenarien. Es ist immer praktisch zu beherrschen, wie diese Funktionen programmgesteuert verwendet werden.

Wie immer ist der Code für diese Beispiele auf GitHub verfügbar.