Á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.