Deaktivieren von Spring Security Logout-Weiterleitungen

1. Übersicht

In diesem kurzen Tutorial werden wir uns genauer ansehen, wie Sie Abmeldeumleitungen in Spring Security deaktivieren .

Wir beginnen mit einem kurzen Hintergrund über die Funktionsweise des Abmeldeflusses in Spring Security. Anschließend zeigen wir anhand eines praktischen Beispiels, wie Sie eine Benutzerumleitung nach einer erfolgreichen Abmeldung vermeiden können.

2. Melden Sie sich in Spring Security ab

Kurz gesagt, Spring Security bietet eine sofort einsatzbereite Unterstützung für den Abmeldemechanismus über die logout () - DSL-Methode. Grundsätzlich löst Spring Security das Abmelden aus, wenn ein Benutzer auf die Standard-Abmelde-URL / logout trifft .

Erwähnenswert ist, dass der Standardwert der Abmelde-URL vor Spring Security 4 / j_spring_security_logout war .

Spring Security bietet die Möglichkeit, Benutzer nach dem Abmelden zu einer bestimmten URL umzuleiten. Es gibt jedoch einige Fälle, in denen wir dieses Verhalten vermeiden möchten.

Lassen Sie uns also ohne weiteres sehen, wie Sie die Logik zum Deaktivieren von Abmeldeumleitungen in Spring Security implementieren .

3. Deaktivieren Sie die Spring Security Logout-Umleitung

Standardmäßig leitet Spring Security Benutzer nach erfolgreicher Abmeldung zu / login? Logout um. In diesem Abschnitt konzentrieren wir uns darauf, wie Sie verhindern können, dass Benutzer nach dem Abmelden zur Anmeldeseite umgeleitet werden.

Beachten Sie, dass wir die Standard-Umleitungs-URL mithilfe der DSL-Methode logoutSuccessUrl () überschreiben können .

Der Hauptpunkt hier ist zu zeigen, wie eine Umleitung vermieden werden kann, wenn die / logout- URL von einem REST-Client aufgerufen wird.

Tatsächlich bietet die Log outSuccessHandler- Schnittstelle eine flexible Möglichkeit, benutzerdefinierte Logik auszuführen, wenn der Abmeldevorgang erfolgreich ausgeführt wird.

Hier verwenden wir einen benutzerdefinierten LogoutSuccessHandler , um nur einen sauberen 200-Statuscode zurückzugeben . Auf diese Weise werden wir nicht zu einer Seite weitergeleitet.

Implementieren wir nun die erforderliche Spring Security-Konfiguration, die zum Deaktivieren von Abmeldeumleitungen erforderlich ist:

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

Der wichtige Teil der obigen Konfiguration ist die logoutSuccessHandler () -Methode. Wie wir sehen können, verwenden wir einen Lambda-Ausdruck, um unseren benutzerdefinierten Abmeldeerfolgshandler zu definieren.

Beachten Sie, dass wir auch eine einfache Implementierungsklasse der LogoutSuccessHandler- Schnittstelle erstellen und diese mithilfe von DSL an die logoutSuccessHandler () -Methode übergeben können.

4. Testen

Nachdem wir alle Teile zusammengefügt haben, testen wir den Endpunkt / logout , um zu bestätigen, dass alles wie erwartet funktioniert.

Beachten Sie, dass wir in unserem Test MockMvc verwenden , um Anforderungen zu senden / abzumelden .

Lassen Sie uns zunächst eine einfache Testklasse erstellen und das MockMvc- Objekt darin einfügen :

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

Nun, lassen Sie uns eine Methode schreiben zu testen unser / Logout - Endpunkt:

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

Zuletzt versuchen wir, unseren Testcode aufzuschlüsseln:

  • perform (post ("/ logout")) ruft den / logout- Endpunkt als einfache POST-Anforderung auf
  • with (csrf ()) fügt der Abfrage den erwarteten Parameter _csrf hinzu
  • status () gibt den Statuscode der HTTP-Antwort zurück
  • Mit jsonPath () können Sie auf den Text der HTTP-Antwort zugreifen und diesen überprüfen

5. Schlussfolgerung

Zusammenfassend haben wir erklärt und veranschaulicht, wie die Herausforderung des Deaktivierens von Abmeldeumleitungen in Spring Security und Spring Boot gelöst werden kann.

Wie üblich ist der vollständige Quellcode für diesen Artikel auf GitHub verfügbar.