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.