Kako onemogućiti preusmjeravanja proljetne sigurnosne odjave

1. Pregled

U ovom kratkom vodiču detaljno ćemo pogledati kako onemogućiti preusmjeravanja pri odjavi u Spring Security.

Prvo ćemo započeti s kratkom pozadinom o tome kako tijek odjave funkcionira u Spring Securityu. Zatim ćemo na praktičnom primjeru ilustrirati kako izbjeći preusmjeravanje korisnika nakon uspješne odjave.

2. Odjava u Spring Security

Ukratko, Spring Security pruža izvanmrežnu podršku za mehanizam odjave putem Odjavite se() DSL metoda. U osnovi, Spring Security pokreće odjavu kada korisnik pogodi zadani URL odjave koji je /Odjavite se.

Vrijedno je spomenuti da je zadana vrijednost URL-a za odjavu bila / j_spring_security_logout prije proljetne sigurnosti 4.

Spring Security nudi mogućnost preusmjeravanja korisnika na određeni URL nakon odjave. Međutim, postoje neke prilike kada želimo izbjeći ovo ponašanje.

Dakle, bez daljnjeg odlaganja, pogledajmo kako implementirati logiku onemogućavanja preusmjeravanja odjave u Spring Security.

3. Onemogućite preusmjeravanje proljetne sigurnosne odjave

Prema zadanim postavkama, Spring Security preusmjerava korisnike na / prijava? odjava nakon uspješne odjave. Dakle, u ovom ćemo se dijelu usredotočiti na to kako spriječiti preusmjeravanje korisnika na stranicu za prijavu nakon odjave.

Imajte na umu da možemo nadjačati zadani URL za preusmjeravanje uz pomoć logoutSuccessUrl () DSL metoda.

Glavna je stvar ovdje pokazati kako izbjeći preusmjeravanje kada /Odjavite se URL se poziva s REST klijenta.

Zapravo, DnevnikoutSuccessHandler sučelje nudi fleksibilan način izvršavanja prilagođene logike kada se postupak odjave uspješno izvede.

Pa evo, mi ćemo koristiti običaj LogoutSuccessHandler za povratak samo čistog statusnog koda 200. Na taj nas način neće preusmjeriti na bilo koju stranicu.

Sada ćemo implementirati potrebnu konfiguraciju Spring Security koja je potrebna za onemogućavanje preusmjeravanja pri odjavi:

@Configuration @EnableWebSecurity javna klasa SpringSecurityConfig proširuje WebSecurityConfigurerAdapter {@Override zaštićena void konfiguracija (HttpSecurity http) baca izuzetak {http .authorizeRequests (authz -> authz .mvcMatchers ("/ prijava"). ) .logout (odjava -> odjava .permitAll () .logoutSuccessHandler ((zahtjev, odgovor, provjera autentičnosti) -> {response.setStatus (HttpServletResponse.SC_OK);});}}

Važan dio koji treba napomenuti iz gornje konfiguracije je logoutSuccessHandler () metoda. Kao što vidimo, koristimo lambda izraz kako bismo definirali naš prilagođeni rukovatelj uspjehom odjave.

Imajte na umu da možemo stvoriti i jednostavnu izvedbenu klasu LogoutSuccessHandler i koristite DSL za prosljeđivanje na logoutSuccessHandler () metoda.

4. Ispitivanje

Sad kad smo složili sve dijelove, testirajmo /Odjavite se krajnja točka da potvrdi da sve funkcionira prema očekivanjima.

Imajte na umu da ćemo koristiti MockMvc poslati /Odjavite se zahtjev u našem testu.

Prvo, izradimo jednostavnu testnu klasu i ubrizgamo MockMvc objekt u njemu:

javna klasa LogoutApplicationUnitTest {@Autowired private MockMvc mockMvc; // testni slučaj}

Sada, napišimo metodu za testiranje našeg /Odjavite se krajnja točka:

@Test public void whenLogout_thenDisableRedirect () baca iznimku {this.mockMvc.perform (post ("/ logout"). With (csrf ())) .andExpect (status (). IsOk ()) .andExpect ("$" ) .doesNotExist ()) .andExpect (unauthenticated ()) .andReturn (); }

Na kraju, pokušajmo razbiti naš testni kôd:

  • izvesti (objaviti (“/ odjava”)) poziva na /Odjavite se krajnja točka kao jednostavan POST zahtjev
  • sa (csrf ()) dodaje očekivano _csrf parametar za upit
  • status() vraća statusni kôd HTTP odgovora
  • jsonPath () omogućuje pristup i pregled tijela HTTP odgovora

5. Zaključak

Ukratko, objasnili smo i ilustrirali kako se nositi s izazovom onemogućavanja preusmjeravanja odjave u Spring Security i Spring Boot.

Kao i obično, cjeloviti izvorni kod za ovaj članak dostupan je na GitHubu.


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