Po prihlásení presmerujte na rôzne stránky s jarným zabezpečením

1. Prehľad

Spoločnou požiadavkou pre webovú aplikáciu je po prihlásení presmerovať rôzne typy používateľov na rôzne stránky. Príkladom toho môže byť presmerovanie štandardných používateľov na a /homepage.html stránku a administrátorov a /console.html stránka napríklad.

Tento článok ukáže, ako rýchlo a bezpečne implementovať tento mechanizmus pomocou nástroja Spring Security. Tento článok tiež nadväzuje na jarný tutoriál MVC, ktorý sa zaoberá nastavením základných vecí MVC potrebných pre projekt.

2. Jarná konfigurácia zabezpečenia

Spring Security poskytuje komponent, ktorý má priamu zodpovednosť za rozhodovanie, čo robiť po úspešnej autentifikácii - AuthenticationSuccessHandler.

2.1. Základná konfigurácia

Najprv si nakonfigurujme základné @ Konfigurácia a @Služba trieda:

@Configuration @EnableWebSecurity verejná trieda SecSecurityConfig rozširuje WebSecurityConfigurerAdapter {@Override protected void configure (final HttpSecurity http) vyvolá výnimku {http .authorizeRequests () // ... endpoints .formLogin () .loginPage ("/ login.html"). ("/ login") .defaultSuccessUrl ("/ homepage.html", true) // ... iná konfigurácia}}

Súčasťou tejto konfigurácie, na ktorú sa treba sústrediť, je defaultSuccessUrl () metóda. Po úspešnom prihlásení bude každý používateľ presmerovaný na homepage.html.

Ďalej musíme nakonfigurovať používateľov a ich role. Na účely tohto článku implementujeme jednoduchý UserDetailService s dvoma používateľmi, z ktorých každý má jednu rolu. Viac sa o tejto téme dozviete v našom článku Jarná bezpečnosť - roly a privilégiá.

@Service verejná trieda MyUserDetailsService implementuje UserDetailsService {súkromné ​​roly mapy = nový HashMap (); @PostConstruct public void init () {role.put ("admin2", nový užívateľ ("admin", "{noop} admin1", getAuthority ("ROLE_ADMIN"))); role.put ("user2", new User ("user", "{noop} user1", getAuthority ("ROLE_USER"))); } @Override public UserDetails loadUserByUsername (reťazec používateľské meno) {návrat role.get (používateľské meno); } private List getAuthority (reťazcová rola) {návrat Collections.singletonList (nová SimpleGrantedAuthority (rola)); }} 

Upozorňujeme tiež, že v tomto jednoduchom príklade nebudeme používať kódovač hesiel, preto sú pred heslami uvedené predvoľby {noop}.

2.2. Pridanie vlastného ovládača úspechu

Teraz máme dvoch používateľov s dvoma rôznymi rolami: používateľ a admin. Po úspešnom prihlásení budú obaja presmerovaní na hompeage.html. Pozrime sa, ako môžeme mať odlišné presmerovanie na základe roly používateľa.

Najprv musíme definovať vlastný obslužný program úspechu ako fazuľu:

@Bean public AuthenticationSuccessHandler myAuthenticationSuccessHandler () {vrátiť nový MySimpleUrlAuthenticationSuccessHandler (); } 

A potom vymeňte defaultSuccessUrl hovor s successHandler metóda, ktorá akceptuje náš vlastný obslužný program úspechu ako parameter:

@Override protected void configure (final HttpSecurity http) vyvolá výnimku {http .authorizeRequests () // endpoints .formLogin () .loginPage ("/ login.html") .loginProcessingUrl ("/ login") .successHandler (myAuthenticationSuccessHandler ()) // iná konfigurácia} 

2.3. Konfigurácia XML

Predtým, ako sa pozrieme na implementáciu našej vlastnej obslužnej rutiny úspechu, pozrime sa tiež na ekvivalentnú konfiguráciu XML:

3. Obslužný program úspechu vlastnej autentifikácie

Okrem toho AuthenticationSuccessHandler rozhranie poskytuje Spring tiež rozumné východiskové nastavenie pre túto súčasť stratégie - AbstractAuthenticationTargetUrlRequestHandler a jednoduchá implementácia - SimpleUrlAuthenticationSuccessHandler. Tieto implementácie zvyčajne určia adresu URL po prihlásení a vykonajú presmerovanie na túto adresu URL.

Mechanizmus určenia tejto cieľovej adresy URL, aj keď je trochu flexibilný, neumožňuje programovo vykonať určovanie - preto implementujeme rozhranie a poskytneme vlastnú implementáciu obslužného programu úspechu. Táto implementácia bude určovať adresu URL, na ktorú bude používateľ presmerovaný po prihlásení, na základe roly používateľa.

V prvom rade musíme prekonať onAuthenticationSuccess metóda:

verejná trieda MySimpleUrlAuthenticationSuccessHandler implementuje AuthenticationSuccessHandler {chránený log logger = LogFactory.getLog (this.getClass ()); private RedirectStrategy redirectStrategy = nový DefaultRedirectStrategy (); @Override public void onAuthenticationSuccess (požiadavka HttpServletRequest, odpoveď HttpServletResponse, autentifikácia autentifikácie) hodí IOException {handle (požiadavka, odpoveď, autentifikácia); clearAuthenticationAttributes (požiadavka); } 

Naša prispôsobená metóda volá dve pomocné metódy:

chránený handle neplatnosti (požiadavka HttpServletRequest, odpoveď HttpServletResponse, autentifikácia autentifikácie) vyvolá IOException {String targetUrl = determineTargetUrl (autentifikácia); if (response.isCommit ()) {logger.debug ("Odozva už bola potvrdená. Nie je možné ju presmerovať na" + targetUrl); návrat; } redirectStrategy.sendRedirect (požiadavka, odpoveď, targetUrl); } 

Ak táto metóda skutočne funguje a mapuje používateľa na cieľovú adresu URL:

protected String determineTargetUrl (final Authentication authentication) {Map roleTargetUrlMap = new HashMap (); roleTargetUrlMap.put ("ROLE_USER", "/homepage.html"); roleTargetUrlMap.put ("ROLE_ADMIN", "/console.html"); konečné inkasné úrady = authentication.getAuthorities (); pre (konečné GrantedAuthority GrantAuthority: autority) {String AuthorityName = GrantedAuthority.getAuthority (); if (roleTargetUrlMap.containsKey (AuthorityName)) {návrat roleTargetUrlMap.get (AuthorityName); }} hod novu IllegalStateException (); } 

Táto metóda vráti namapovanú adresu URL pre prvú rolu, ktorú má používateľ. Ak má teda používateľ viac rolí, mapovaná adresa URL bude tá, ktorá sa zhoduje s prvou rolou uvedenou v orgánmi zbierka.

protected void clearAuthenticationAttributes (požiadavka HttpServletRequest) {HttpSession session = request.getSession (false); if (session == null) {return; } session.removeAttribute (WebAttributes.AUTHENTICATION_EXCEPTION); }

The determineTargetUrl - čo je jadrom stratégie - sa jednoducho zameriava na typ používateľa (určený orgánom) a na základe tejto roly vyberie cieľovú adresu URL.

Takže používateľ admin - určené ROLE_ADMIN orgán - bude po prihlásení presmerovaný na stránku konzoly štandardný používateľ - podľa určenia ROLE_USER - bude presmerovaný na domovskú stránku.

4. Záver

Ako vždy, kód uvedený v tomto článku je k dispozícii na GitHub. Toto je projekt založený na Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


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