Viderekoble til forskjellige sider etter pålogging med Spring Security

1. Oversikt

Et vanlig krav for en webapplikasjon er å omdirigere forskjellige typer brukere til forskjellige sider etter pålogging. Et eksempel på dette kan være å omdirigere standardbrukere til en /hjemmeside.html side- og adminbrukere til en /console.html side for eksempel.

Denne artikkelen viser hvordan du raskt og trygt implementerer denne mekanismen ved hjelp av Spring Security. Artikkelen bygger også på våren MVC-opplæringen som omhandler å sette opp de viktigste MVC-tingene som er nødvendige for prosjektet.

2. Vårens sikkerhetskonfigurasjon

Spring Security tilbyr en komponent som har det direkte ansvaret for å bestemme hva de skal gjøre etter en vellykket autentisering - AuthenticationSuccessHandler.

2.1. Grunnleggende konfigurasjon

La oss først konfigurere en grunnleggende @Konfigurasjon og @Service klasse:

@Configuration @EnableWebSecurity offentlig klasse SecSecurityConfig utvider WebSecurityConfigurerAdapter {@Override beskyttet ugyldig konfigurering (endelig HttpSecurity http) kaster Unntak {http .authorizeRequests () // ... endpoints .formLogin () .loginPage ("/ login.html". ("/ login") .defaultSuccessUrl ("/ homepage.html", true) // ... annen konfigurasjon}}

Den delen av denne konfigurasjonen å fokusere på er defaultSuccessUrl () metode. Etter vellykket pålogging vil enhver bruker bli omdirigert til hjemmeside.html.

Videre må vi konfigurere brukere og deres roller. For formålet med denne artikkelen implementerer vi en enkel UserDetailService med to brukere, som hver har en enkelt rolle. For mer om dette emnet, les vår artikkel Spring Security - Roller og privilegier.

@Service offentlig klasse MyUserDetailsService implementerer UserDetailsService {private Map-roller = ny HashMap (); @PostConstruct public void init () {role.put ("admin2", new User ("admin", "{noop} admin1", getAuthority ("ROLE_ADMIN"))); roller.put ("bruker2", ny bruker ("bruker", "{noop} bruker1", getAuthority ("ROLE_USER"))); } @ Override offentlige UserDetails loadUserByUsername (String brukernavn) {return role.get (brukernavn); } privat liste getAuthority (strengrolle) {return Collections.singletonList (ny SimpleGrantedAuthority (rolle)); }} 

Vær også oppmerksom på at i dette enkle eksemplet vil vi ikke bruke en passordkoder, derfor er passordene prefikset med {noop}.

2.2. Legge til den tilpassede suksessbehandleren

Vi har nå to brukere med de to forskjellige rollene: bruker og admin. Etter en vellykket pålogging blir begge viderekoblet til hompeage.html. La oss se på hvordan vi kan ha en annen omdirigering basert på brukerens rolle.

Først må vi definere en tilpasset suksessbehandler som en bønne:

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

Og bytt deretter ut defaultSuccessUrl ring med suksessHandler metoden, som godtar vår tilpassede suksessbehandler som en parameter:

@ Override beskyttet ugyldig konfigurasjon (endelig HttpSecurity http) kaster unntak {http .authorizeRequests () // endpoints .formLogin () .loginPage ("/ login.html") .loginProcessingUrl ("/ login") .successHandler (myAuthenticationSuccessHandler () // annen konfigurasjon} 

2.3. XML-konfigurasjon

Før vi ser på implementeringen av vår tilpassede suksessbehandler, la oss også se på den tilsvarende XML-konfigurasjonen:

3. Custom Authentication Success Handler

Ved siden av AuthenticationSuccessHandler grensesnitt, gir Spring også en fornuftig standard for denne strategikomponenten - AbstractAuthenticationTargetUrlRequestHandler og en enkel implementering - SimpleUrlAuthenticationSuccessHandler. Vanligvis vil disse implementeringene bestemme URL-en etter pålogging og utføre en viderekobling til den URL-en.

Selv om det er noe fleksibelt, tillater ikke mekanismen for å bestemme denne mål-URL-en bestemmelsen programmatisk - så vi skal implementere grensesnittet og tilby en tilpasset implementering av suksessbehandleren. Denne implementeringen skal bestemme URL-en som brukeren skal omdirigeres til etter pålogging, basert på brukerens rolle.

Først av alt må vi overstyre onAuthenticationSuccess metode:

offentlig klasse MySimpleUrlAuthenticationSuccessHandler implementerer AuthenticationSuccessHandler {beskyttet logglogger = LogFactory.getLog (this.getClass ()); private RedirectStrategy redirectStrategy = ny DefaultRedirectStrategy (); @Override public void onAuthenticationSuccess (HttpServletRequest request, HttpServletResponse response, Authentication authentication) kaster IOException {håndtak (forespørsel, svar, autentisering); clearAuthenticationAttributes (forespørsel); } 

Vår tilpassede metode kaller to hjelpermetoder:

beskyttet tomhåndtak (HttpServletRequest-forespørsel, HttpServletResponse-respons, autentiseringsautentisering) kaster IOException {String targetUrl = determinTargetUrl (autentisering); if (response.isCommitted ()) {logger.debug ("Svaret er allerede begått. Kan ikke omdirigere til" + targetUrl); komme tilbake; } redirectStrategy.sendRedirect (forespørsel, svar, targetUrl); } 

Hvor følgende metode fungerer, og kartlegger brukeren til mål-URL:

beskyttet streng determTargetUrl (endelig godkjenningsautentisering) {Map roleTargetUrlMap = new HashMap (); roleTargetUrlMap.put ("ROLE_USER", "/homepage.html"); roleTargetUrlMap.put ("ROLE_ADMIN", "/console.html"); endelige innsamlingsmyndigheter = authentication.getAuthorities (); for (endelig GrantedAuthority grantAuthority: autoriteter) {String AuthorityName = givenAuthority.getAuthority (); hvis (roleTargetUrlMap.containsKey (autoritetsnavn)) {return roleTargetUrlMap.get (autoritetsnavn); }} kast nytt IllegalStateException (); } 

Merk at denne metoden returnerer den tilordnede URL-en for den første rollen brukeren har. Så hvis en bruker har flere roller, vil den tilordnede URL-en være den som samsvarer med den første rollen som er gitt i autoriteter samling.

beskyttet tomrom clearAuthenticationAttributes (HttpServletRequest forespørsel) {HttpSession session = request.getSession (false); hvis (økt == null) {retur; } session.removeAttribute (WebAttributes.AUTHENTICATION_EXCEPTION); }

De determinTargetUrl - som er kjernen i strategien - bare ser på brukertypen (bestemt av autoriteten) og velger mål-URL basert på denne rollen.

Så, en admin bruker - bestemt av ROLE_ADMIN autoritet - vil bli omdirigert til konsollsiden etter pålogging, mens standardbrukeren - som bestemt av ROLE_USER - blir omdirigert til hjemmesiden.

4. Konklusjon

Som alltid er koden presentert i denne artikkelen tilgjengelig på GitHub. Dette er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.


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