Sådan deaktiveres Spring Security Logout-omdirigeringer

1. Oversigt

I denne korte vejledning skal vi se nærmere på hvordan du deaktiverer afmeldingsomdirigeringer i Spring Security.

Vi starter først med en kort baggrund om, hvordan logout-flowet fungerer i Spring Security. Derefter illustrerer vi gennem et praktisk eksempel, hvordan man undgår omdirigering af brugere efter en vellykket logout.

2. Log af i Spring Security

Kort sagt, Spring Security yder out-of-box support til aflogningsmekanismen gennem Log ud() DSL-metode. I bund og grund, Spring Security udløser log ud, når en bruger rammer den standard-logout-URL, der er /Log ud.

Det er værd at nævne, at standardværdien for logout-URL'en var / j_spring_security_logout inden forårssikkerhed 4.

Spring Security giver mulighed for at omdirigere brugere til en bestemt URL efter aflogning. Der er dog nogle gange, hvor vi vil undgå denne adfærd.

Så uden videre, lad os se, hvordan vi implementerer logikken med at deaktivere logout-omdirigeringer i Spring Security.

3. Deaktiver Spring Security Logout Redirect

Som standard omdirigerer Spring Security brugere til / login? logout efter en vellykket logout. Så i dette afsnit vil vi fokusere på, hvordan man forhindrer brugeromdirigering til login-siden efter aflogning.

Bemærk, at vi kan tilsidesætte standard omdirigerings-URL ved hjælp af logoutSuccessUrl () DSL-metode.

Hovedpointen her er at vise, hvordan man undgår omdirigering, når /Log ud URL kaldes fra en REST-klient.

Faktisk er det LogoutSuccessHandler interface giver en fleksibel måde at udføre brugerdefineret logik på, når logoutprocessen udføres med succes.

Så her skal vi brug en brugerdefineret LogoutSuccessHandler kun for at returnere en ren 200 statuskode. På den måde omdirigerer det os ikke til nogen side.

Lad os nu implementere den nødvendige Spring Security-konfiguration, der kræves for at deaktivere omdirigeringer af logout:

@Configuration @EnableWebSecurity offentlig klasse SpringSecurityConfig udvider WebSecurityConfigurerAdapter {@Override beskyttet ugyldig konfiguration (HttpSecurity http) kaster undtagelse {http .authorizeRequests (authz -> authz .mvcMatchers ("/ login"). PermitAest () .any. ) .logout (logout -> logout .permitAll () .logoutSuccessHandler ((anmodning, svar, godkendelse) -> {respons.setStatus (HttpServletResponse.SC_OK);});}}

Den vigtige del at bemærke fra ovenstående konfiguration er logoutSuccessHandler () metode. Som vi kan se, bruger vi et lambda-udtryk til at definere vores brugerdefinerede logout-succeshåndterer.

Husk, at vi også kan oprette en simpel implementeringsklasse for LogoutSuccessHandler interface og brug DSL til at videregive det til logoutSuccessHandler () metode.

4. Testning

Nu hvor vi sætter alle brikkerne sammen, lad os teste /Log ud slutpunkt for at bekræfte, at alt fungerer som forventet.

Bemærk, at vi bruger MockMvc at sende /Log ud anmodning i vores test.

Lad os først oprette en simpel testklasse og indsprøjte MockMvc objekt i det:

offentlig klasse LogoutApplicationUnitTest {@Autowired private MockMvc mockMvc; // test sag }

Nu, lad os skrive en metode til at teste vores /Log ud slutpunkt:

@Test offentlig ugyldig nårLogout_thenDisableRedirect () kaster undtagelse {this.mockMvc.perform (post ("/ logout"). Med (csrf ())) .ogExpect (status (). IsOk ()). Og Expect (jsonPath ("$") ) .doesNotExist ()) .ogExpect (unauthenticated ()) .andReturn (); }

Endelig lad os prøve at nedbryde vores testkode:

  • udfør (post (“/ logout”)) påberåber sig /Log ud slutpunkt som en simpel POST-anmodning
  • med (csrf ()) tilføjer det forventede _csrf parameter til forespørgslen
  • status () returnerer statuskoden for HTTP-svaret
  • jsonPath () giver adgang til og inspektion af HTTP-svarets krop

5. Konklusion

For at opsummere har vi forklaret og illustreret, hvordan man tackler udfordringen ved at deaktivere logout-omdirigeringer i Spring Security og Spring Boot.

Som sædvanlig er den komplette kildekode til denne artikel tilgængelig på GitHub.