Preusmjeravanje na različite stranice nakon prijave s Spring Security

1. Pregled

Uobičajeni zahtjev za web aplikaciju je da preusmjeriti različite vrste korisnika na različite stranice nakon prijave. Primjer toga bio bi preusmjeravanje standardnih korisnika na /homepage.html stranicu i administratorske korisnike na a /console.html stranica na primjer.

Ovaj će članak pokazati kako brzo i sigurno implementirati ovaj mehanizam koristeći Spring Security. Članak se također nadovezuje na Spring MVC tutorial koji se bavi postavljanjem osnovnih MVC stvari potrebnih za projekt.

2. Proljetna sigurnosna konfiguracija

Spring Security nudi komponentu koja ima izravnu odgovornost odlučivanja što učiniti nakon uspješne provjere autentičnosti - AuthenticationSuccessHandler.

2.1. Osnovna konfiguracija

Prvo konfigurirajmo osnovni @Konfiguracija i @Servis razred:

@Configuration @EnableWebSecurity javna klasa SecSecurityConfig proširuje WebSecurityConfigurerAdapter {@Override zaštićena void konfiguracija (konačni HttpSecurity http) baca izuzetak {http .authorizeRequests () // ... endpoints .form.Login () .loginPhtl ("log.Print ("). ("/ login") .defaultSuccessUrl ("/ homepage.html", true) // ... druga konfiguracija}}

Dio ove konfiguracije na koji se treba usredotočiti je defaultSuccessUrl () metoda. Nakon uspješne prijave, bilo koji korisnik bit će preusmjeren na početna stranica.html.

Nadalje, moramo konfigurirati korisnike i njihove uloge. U svrhu ovog članka implementirat ćemo jednostavan UserDetailService s dva korisnika, svaki s jednom ulogom. Više o ovoj temi pročitajte u našem članku Proljetna sigurnost - uloge i privilegije.

@Service javna klasa MyUserDetailsService implementira UserDetailsService {uloge privatne mape = novi HashMap (); @PostConstruct javna void init () {role.put ("admin2", novi korisnik ("admin", "{noop} admin1", getAuthority ("ROLE_ADMIN"))); role.put ("user2", new User ("user", "{noop} user1", getAuthority ("ROLE_USER"))); } @Override public UserDetails loadUserByUsername (String username) {return role.get (username); } privatni popis getAuthority (uloga niza) {return Collections.singletonList (nova SimpleGrantedAuthority (uloga)); }} 

Također imajte na umu da u ovom jednostavnom primjeru nećemo koristiti koder zaporke, stoga su lozinke s prefiksom {noop}.

2.2. Dodavanje prilagođenog rukovatelja uspjehom

Sada imamo dva korisnika s dvije različite uloge: korisnik i admin. Nakon uspješne prijave, oba će biti preusmjerena na hompeage.html. Pogledajmo kako možemo imati različito preusmjeravanje na temelju uloge korisnika.

Prvo, moramo definirati prilagođeni rukovatelj uspjehom kao grah:

@Bean public AuthenticationSuccessHandler myAuthenticationSuccessHandler () {return new MySimpleUrlAuthenticationSuccessHandler (); } 

A zatim zamijenite defaultSuccessUrl nazovite s uspjehHandler metoda koja prihvaća naš prilagođeni rukovatelj uspjehom kao parametar:

@Override zaštićena void konfiguracija (konačni HttpSecurity http) baca izuzetak {http .authorizeRequests () // krajnje točke .formLogin () .loginPage ("/ login.html") .loginProcessingUrl ("/ login") .successHandler (myAuthenticationSuccessHandlerSuccessHandler (Pro) // druga konfiguracija} 

2.3. XML konfiguracija

Prije nego što pogledamo implementaciju našeg prilagođenog rukovatelja uspjehom, pogledajmo i ekvivalentnu XML konfiguraciju:

3. Prilagođeni rukovatelj uspjehom autentifikacije

Osim AuthenticationSuccessHandler sučelje, Spring također nudi razumni zadani zadatak za ovu strategijsku komponentu - AbstractAuthenticationTargetUrlRequestHandler i jednostavna implementacija - SimpleUrlAuthenticationSuccessHandler. Te će implementacije obično odrediti URL nakon prijave i izvršiti preusmjeravanje na taj URL.

Iako je donekle fleksibilan, mehanizam za određivanje ovog ciljnog URL-a ne dopušta da se određivanje vrši programski - pa ćemo implementirati sučelje i pružiti prilagođenu implementaciju voditelja uspjeha. Ova implementacija će odrediti URL na koji će preusmjeriti korisnika nakon prijave na temelju uloge korisnika.

Prije svega, moramo nadjačati onAuthenticationSuccess metoda:

javna klasa MySimpleUrlAuthenticationSuccessHandler implementira AuthenticationSuccessHandler {zaštićen log logger = LogFactory.getLog (this.getClass ()); private RedirectStrategy redirectStrategy = novi DefaultRedirectStrategy (); @Override public void onAuthenticationSuccess (HttpServletRequest zahtjev, HttpServletResponse odgovor, Autentifikacija autentifikacija) baca IOException {handle (zahtjev, odgovor, autentifikacija); clearAuthenticationAttributes (zahtjev); } 

Naša prilagođena metoda poziva dvije pomoćne metode:

zaštićena ručka za poništenje (zahtjev HttpServletRequest, odgovor HttpServletResponse, provjera autentičnosti) baca IOException {String targetUrl = deterTargetUrl (autentifikacija); if (response.isCommitted ()) {logger.debug ("Odgovor je već predan. Nije moguće preusmjeriti na" + targetUrl); povratak; } redirectStrategy.sendRedirect (zahtjev, odgovor, targetUrl); } 

Gdje sljedeća metoda stvarno radi i preslikava korisnika na ciljni URL:

zaštićeni String identifyTargetUrl (konačna provjera autentičnosti) {Map roleTargetUrlMap = new HashMap (); roleTargetUrlMap.put ("ROLE_USER", "/homepage.html"); roleTargetUrlMap.put ("ROLE_ADMIN", "/console.html"); konačna ovlaštenja za prikupljanje = authentication.getAuthorities (); for (final GrantedAuthority grantAuthority: powers) {String AuthorityName = grantAuthority.getAuthority (); if (roleTargetUrlMap.containsKey (AuthorityName)) {return roleTargetUrlMap.get (AuthorityName); }} baciti novi IllegalStateException (); } 

Imajte na umu da će ova metoda vratiti mapirani URL za prvu ulogu koju korisnik ima. Dakle, ako korisnik ima više uloga, mapirani URL bit će onaj koji se podudara s prvom ulogom danom u vlasti kolekcija.

zaštićena praznina clearAuthenticationAttributes (zahtjev HttpServletRequest) {HttpSession session = request.getSession (false); if (session == null) {return; } session.removeAttribute (WebAttributes.AUTHENTICATION_EXCEPTION); }

The DeterTargetUrl - što je srž strategije - jednostavno gleda na vrstu korisnika (koju određuje nadležno tijelo) i odabire ciljani URL na temelju ove uloge.

Dakle, an korisnik administratora - određuje ROLE_ADMIN autoritet - bit će preusmjeren na stranicu konzole nakon prijave, dok standardni korisnik - kako je utvrdio ROLE_USER - bit će preusmjeren na početnu stranicu.

4. Zaključak

Kao i uvijek, kôd predstavljen u ovom članku dostupan je na GitHubu. Ovo je projekt zasnovan na Mavenu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.


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