Átirányítás különböző oldalakra a tavaszi biztonsággal történő bejelentkezés után

1. Áttekintés

A webalkalmazás általános követelménye az a különböző típusú felhasználókat a bejelentkezés után különböző oldalakra irányítja át. Erre példa lehet a standard felhasználók átirányítása a /homepage.html oldal és admin felhasználók a /console.html oldal például.

Ez a cikk bemutatja, hogyan lehet gyorsan és biztonságosan megvalósítani ezt a mechanizmust a Spring Security segítségével. A cikk a tavaszi MVC oktatóanyag tetejére is épül, amely a projekthez szükséges alapvető MVC dolgok felállításával foglalkozik.

2. A tavaszi biztonsági konfiguráció

A Spring Security egy olyan összetevőt biztosít, amelynek közvetlen felelőssége eldönteni, hogy mit tegyen a sikeres hitelesítés után - a AuthenticationSuccessHandler.

2.1. Alapkonfiguráció

Konfiguráljuk először az alapszintet @ Konfiguráció és @Szolgáltatás osztály:

A @Configuration @EnableWebSecurity nyilvános osztály a SecSecurityConfig kiterjeszti a WebSecurityConfigurerAdapter {@Orride védett void konfigurációt (végleges HttpSecurity http) a {http .authorizeRequests () // ... ... ... végpontok .formLogin () .loginProcing ("/ login.html.) Logot. ("/ login") .defaultSuccessUrl ("/ homepage.html", true) // ... egyéb konfiguráció}}

Ennek a konfigurációnak az a része, amelyre összpontosít, a defaultSuccessUrl () módszer. Sikeres bejelentkezés után minden felhasználó átirányításra kerül homepage.html.

Továbbá konfigurálnunk kell a felhasználókat és szerepeiket. E cikk alkalmazásában egy egyszerű megoldást fogunk megvalósítani UserDetailService két felhasználóval, mindegyiknek egyetlen szerepe van. Ha többet szeretne megtudni erről a témáról, olvassa el a Tavaszi biztonság - szerepek és kiváltságok című cikkünket.

@Service public class A MyUserDetailsService megvalósítja a UserDetailsService {private Map szerepeket = új HashMap (); @PostConstruct public void init () {role.put ("admin2", új Felhasználó ("admin", "{noop} admin1", getAuthority ("ROLE_ADMIN"))); szerepek.put ("user2", new User ("user", "{noop} user1", getAuthority ("ROLE_USER"))); } @Orride public UserDetails loadUserByUsername (String felhasználónév) {return szerepek.get (felhasználónév); } privát lista getAuthority (karakterlánc-szerepkör) {return Collections.singletonList (új SimpleGrantedAuthority (szerepkör)); }} 

Vegye figyelembe azt is, hogy ebben az egyszerű példában nem használunk jelszó kódolót, ezért a jelszavak előtaggal vannak ellátva {noop}.

2.2. Az egyéni sikerkezelő hozzáadása

Most két felhasználónk van a két különböző szerepkörrel: felhasználó és admin. Sikeres bejelentkezés után mindkettő át lesz irányítva hompeage.html. Nézzük meg, hogyan lehet egy másik átirányítás a felhasználó szerepe alapján.

Először babként kell meghatároznunk egy egyedi sikerkezelőt:

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

És akkor cserélje ki a defaultSuccessUrl hívja a sikerHandler metódus, amely elfogadja az egyedi sikerkezelőt paraméterként:

A @Orride protected void configure (final HttpSecurity http) dobja a {http .authorizeRequests () // végpontok .formLogin () .loginPage ("/ login.html") .loginProcessingUrl ("/ login") .successHandler (myAuthenticationSuccessHandler ()) kivételt // egyéb konfiguráció} 

2.3. XML konfiguráció

Mielőtt megvizsgálnánk az egyedi sikerkezelőnk megvalósítását, nézzük meg az egyenértékű XML konfigurációt is:

3. Az egyedi hitelesítés sikerkezelője

mellett AuthenticationSuccessHandler felület, a Spring egy ésszerű alapértelmezést is biztosít ehhez a stratégiai komponenshez - a AbstractAuthenticationTargetUrlRequestHandler és egy egyszerű megvalósítás - a SimpleUrlAuthenticationSuccessHandler. Ezek a megvalósítások általában a bejelentkezés után meghatározzák az URL-t, és átirányítást hajtanak végre az URL-re.

Bár kissé rugalmas, a cél URL meghatározásának mechanizmusa nem teszi lehetővé a meghatározás programozott elvégzését - ezért bevezetjük az interfészt és biztosítjuk a sikerkezelő egyedi megvalósítását. Ez a megvalósítás meghatározza az URL-t, ahová a felhasználót a bejelentkezés után át kell irányítani a felhasználó szerepe alapján.

Először felül kell írnunk a onAuthenticationSuccess módszer:

public class MySimpleUrlAuthenticationSuccessHandler megvalósítja az AuthenticationSuccessHandler {védett naplózó = LogFactory.getLog (this.getClass ()); privát RedirectStrategy redirectStrategy = új DefaultRedirectStrategy (); @A nyilvános érvénytelenítés felülbírálása onAuthenticationSuccess (HttpServletRequest kérés, HttpServletResponse válasz, Hitelesítési hitelesítés) dobja az IOException {kezelést (kérés, válasz, hitelesítés); clearAuthenticationAttributes (kérés); } 

Testreszabott módszerünk két segítő módszert hív meg:

védett érvénytelen fogantyú (HttpServletRequest kérés, HttpServletResponse válasz, Hitelesítési hitelesítés) dobja az IOException {String targetUrl = determTargetUrl (hitelesítés); if (response.isCommitted ()) {logger.debug ("A válasz már végrehajtásra került. Nem lehet átirányítani a" + targetUrl címre); Visszatérés; } redirectStrategy.sendRedirect (kérés, válasz, targetUrl); } 

Ahol a következő módszer végzi a tényleges munkát, és a felhasználót a cél URL-hez társítja:

védett karakterlánc determTargetUrl (végső hitelesítési hitelesítés) {Map roleTargetUrlMap = new HashMap (); roleTargetUrlMap.put ("ROLE_USER", "/homepage.html"); roleTargetUrlMap.put ("ROLE_ADMIN", "/console.html"); végső behajtási hatóságok = authentication.getAuthorities (); for (végső GrantedAuthority megadottAuthority: hatóságok) {String authorityName = megadottAuthority.getAuthority (); if (roleTargetUrlMap.containsKey (hatóságNév)) {return roleTargetUrlMap.get (hatóságNév); }} dobja az új IllegalStateException () -t; } 

Ne feledje, hogy ez a módszer a leképezett URL-t adja vissza a felhasználó első szerepéhez. Tehát, ha egy felhasználónak több szerepköre van, akkor a leképezett URL lesz az, amely megegyezik a hatóság Gyűjtemény.

védett void clearAuthenticationAttributes (HttpServletRequest kérés) {HttpSession session = request.getSession (false); if (session == null) {return; } session.removeAttribute (WebAttributes.AUTHENTICATION_EXCEPTION); }

A determTargetUrl - amely a stratégia lényege - egyszerűen megnézi a felhasználó típusát (amelyet a hatóság határoz meg) és e szerep alapján választja ki a cél URL-t.

Tehát, egy admin felhasználó - határozza meg a ROLE_ADMIN jogosultság - bejelentkezés után átirányításra kerül a konzololdalra, míg a szokásos felhasználó - ahogyan meghatározta ROLE_USER - átirányításra kerül a kezdőlapra.

4. Következtetés

Mint mindig, a cikkben bemutatott kód elérhető a GitHubon. Ez egy Maven-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.