Slik deaktiverer du vårsikkerhetslogg omdirigeringer

1. Oversikt

I denne korte opplæringen skal vi se nærmere på hvordan du deaktiverer viderekoblinger for utlogging i Spring Security.

Vi begynner først med en kort bakgrunn om hvordan utloggingsflyten fungerer i Spring Security. Deretter illustrerer vi gjennom et praktisk eksempel hvordan du kan unngå omdirigering av brukere etter en vellykket avlogging.

2. Logg ut i vårsikkerhet

Kort sagt, Spring Security gir støtte utenom boksen for avloggingsmekanismen gjennom Logg ut() DSL-metoden. I utgangspunktet, Spring Security utløser utlogging når en bruker treffer standard URL-en for avlogging som er /Logg ut.

Det er verdt å nevne at standardverdien for loggen URL var / j_spring_security_logout før vårsikkerhet 4.

Spring Security tilbyr muligheten til å omdirigere brukere til en bestemt URL etter utlogging. Imidlertid er det noen anledninger når vi vil unngå denne oppførselen.

Så uten videre, la oss se hvordan vi implementerer logikken for å deaktivere avloggings omdirigeringer i Spring Security.

3. Deaktiver omdirigering av vårsikkerhetslogout

Som standard videresender Spring Security brukere til / login? logout etter en vellykket avlogging. Så i denne delen skal vi fokusere på hvordan du kan forhindre brukeromdirigering til påloggingssiden etter utlogging.

Merk at vi kan overstyre standard URL for viderekobling ved hjelp av logoutSuccessUrl () DSL-metoden.

Hovedpoenget her er å vise hvordan du kan unngå omdirigering når /Logg ut URL ringes fra en REST-klient.

Faktisk, den LoggoutSuccessHandler grensesnittet tilbyr en fleksibel måte å utføre tilpasset logikk når utloggingsprosessen er utført.

Så her skal vi bruk en egendefinert LogoutSuccessHandler å bare returnere en ren 200 statuskode. På den måten vil det ikke omdirigere oss til noen side.

La oss nå implementere den nødvendige vårsikkerhetskonfigurasjonen som kreves for å deaktivere omdirigeringer av utlogging:

@Configuration @EnableWebSecurity offentlig klasse SpringSecurityConfig utvider WebSecurityConfigurerAdapter {@Override-beskyttet ugyldig konfigurasjon (HttpSecurity http) kaster Unntak {http .authorizeRequests (authz -> authz .mvcMatchers ("/ login"). PermitAest () .any. ) .logout (logout -> logout .permitAll () .logoutSuccessHandler ((forespørsel, respons, autentisering) -> {response.setStatus (HttpServletResponse.SC_OK);});}}

Den viktige delen å merke seg fra konfigurasjonen ovenfor er logoutSuccessHandler () metode. Som vi ser, bruker vi et lambda-uttrykk for å definere vår tilpassede suksessbehandler for utlogging.

Husk at vi også kan lage en enkel implementeringsklasse for LogoutSuccessHandler grensesnitt og bruk DSL for å overføre det til logoutSuccessHandler () metode.

4. Testing

Nå som vi setter alle brikkene sammen, la oss teste /Logg ut endepunkt for å bekrefte at alt fungerer som forventet.

Merk at vi skal bruke MockMvc å sende /Logg ut forespørsel i testen.

La oss først lage en enkel testklasse og injisere MockMvc objekt i det:

offentlig klasse LogoutApplicationUnitTest {@Autowired private MockMvc mockMvc; // testforsøk }

Nå, la oss skrive en metode for å teste vår /Logg ut sluttpunkt:

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

Til slutt, la oss prøve å bryte ned testkoden vår:

  • utfør (post (“/ logout”)) påberoper seg /Logg ut endepunkt som en enkel POST-forespørsel
  • med (csrf ()) legger til det forventede _csrf parameter til spørringen
  • status() returnerer statuskoden til HTTP-svaret
  • jsonPath () gjør det mulig å få tilgang til og inspisere kroppen til HTTP-responsen

5. Konklusjon

For å oppsummere har vi forklart og illustrert hvordan vi kan takle utfordringen med å deaktivere avloggingsomdirigeringer i Spring Security og Spring Boot.

Som vanlig er den komplette kildekoden for denne artikkelen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found