Ako zakázať jarné bezpečnostné presmerovania odhlásenia

1. Prehľad

V tomto krátkom návode sa podrobne pozrieme ako zakázať presmerovania na odhlásenie v Spring Security.

Najprv začneme krátkym pozadím toho, ako funguje postup odhlásenia v Spring Security. Potom si prostredníctvom praktického príkladu ukážeme, ako sa vyhnúť presmerovaniu používateľov po úspešnom odhlásení.

2. Odhláste sa na jar Zabezpečenie

Stručne povedané, Spring Security poskytuje out-of-box podporu pre mechanizmus odhlásenia cez odhlásiť sa() Metóda DSL. V podstate Zabezpečenie Spring spustí odhlásenie, keď používateľ klikne na predvolenú adresu URL na odhlásenie, ktorá je /odhlásiť sa.

Za zmienku stojí, že predvolená hodnota adresy URL na odhlásenie bola / j_spring_security_logout pred jarnou bezpečnosťou 4.

Spring Security ponúka možnosť presmerovať používateľov na konkrétnu adresu URL po odhlásení. Existujú však prípady, keď sa chceme tomuto správaniu vyhnúť.

Takže bez ďalších okolkov Pozrime sa, ako implementovať logiku zakázania presmerovaní na odhlásenie v Spring Security.

3. Zakážte Spring Security Logout Redirect

V predvolenom nastavení Spring Security presmeruje používateľov na / prihlásiť? odhlásiť sa po úspešnom odhlásení. V tejto časti sa teda zameriame na to, ako zabrániť presmerovaniu používateľov na prihlasovaciu stránku po odhlásení.

Upozorňujeme, že predvolenú adresu URL presmerovania môžeme prepísať pomocou logoutSuccessUrl () Metóda DSL.

Hlavným bodom je ukázať, ako sa vyhnúť presmerovaniu, keď /odhlásiť sa URL sa volá z klienta REST.

V skutočnosti LogoutSuccessHandler rozhranie umožňuje flexibilný spôsob vykonávania vlastnej logiky, keď je proces odhlásenia úspešný.

Takže tu, budeme použite zvyk LogoutSuccessHandler vrátiť iba čistý stavový kód 200. Takto nás nepresmeruje na žiadnu stránku.

Teraz implementujme potrebnú konfiguráciu Spring Security potrebnú na zakázanie presmerovaní odhlásenia:

@Configuration @EnableWebSecurity verejná trieda SpringSecurityConfig rozširuje WebSecurityConfigurerAdapter {@Override protected void configure (HttpSecurity http) vyvolá výnimku {http .authorizeRequests (authz -> authz .mvcMatchers ("/ login"). PermitAll () .anyRequest () .anyRequest ) .logout (odhlásenie -> odhlásenie .permitAll () .logoutSuccessHandler ((požiadavka, odpoveď, autentifikácia) -> {response.setStatus (HttpServletResponse.SC_OK);});}}

Dôležitou súčasťou, ktorú je potrebné poznamenať z vyššie uvedenej konfigurácie, je odhlásenieSuccessHandler () metóda. Ako vidíme, na definovanie našej vlastnej obsluhy úspechu pri odhlásení používame výraz lambda.

Majte na pamäti, že môžeme vytvoriť aj jednoduchú triedu implementácie LogoutSuccessHandler rozhranie a pomocou DSL ich odovzdať do odhlásenieSuccessHandler () metóda.

4. Testovanie

Keď už sme všetky kúsky spojili, otestujme /odhlásiť sa koncový bod na potvrdenie, že všetko funguje podľa očakávaní.

Všimnite si, že budeme používať MockMvc poslať /odhlásiť sa požiadavka v našom teste.

Najskôr vytvorme jednoduchú testovaciu triedu a vložíme MockMvc objekt v ňom:

verejná trieda LogoutApplicationUnitTest {@Autowired private MockMvc mockMvc; // testovacia situácia }

Teraz, napíšme metódu na otestovanie našej /odhlásiť sa koncový bod:

@ Test public void whenLogout_thenDisableRedirect () vyvolá výnimku {this.mockMvc.perform (post ("/ logout"). With (csrf ())) .andExpect (status (). IsOk ()) .andExpect (jsonPath ("$") ) .doesNotExist ()) .andExpect (unauthenticated ()) .andReturn (); }

Na záver sa pokúsime rozdeliť náš testovací kód:

  • vykonať (príspevok („/ odhlásenie“)) sa odvoláva na /odhlásiť sa koncový bod ako jednoduchá požiadavka POST
  • s (csrf ()) dodáva očakávané _csrf parameter do dotazu
  • postavenie() vráti stavový kód odpovede HTTP
  • jsonPath () umožňuje prístup a kontrolu tela odpovede HTTP

5. Záver

Ak to zhrnieme, vysvetlili sme a ilustrovali, ako čeliť výzve zakázania presmerovaní odhlásenia v nástrojoch Spring Security a Spring Boot.

Úplný zdrojový kód tohto článku je ako obvykle k dispozícii na serveri GitHub.


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