Twee inlogpagina's met Spring Security

1. Inleiding

In deze tutorial zullen we zien hoe we dat kunnen configureer Spring Security om met twee verschillende loginpagina's te werken met behulp van twee verschillende Spring Security http elementen in de configuratie.

2. Configureren van 2 Http-elementen

Een van de situaties waarin we mogelijk twee inlogpagina's nodig hebben, is wanneer we één pagina hebben voor beheerders van een applicatie en een andere pagina voor normale gebruikers.

Wij zullen configureer twee http elementen dat zal worden onderscheiden door het URL-patroon dat aan elk is gekoppeld:

  • /gebruiker* voor pagina's die een normale gebruikersauthenticatie nodig hebben om toegang te krijgen
  • /beheerder* voor pagina's die toegankelijk zijn voor een beheerder

Elk http element heeft een andere inlogpagina en een andere inlogverwerkings-URL.

Om twee verschillende te configureren http elementen, laten we twee statische klassen maken die zijn geannoteerd met @Configuratie die de WebSecurityConfigurerAdapter.

Beiden worden in een regular geplaatst @Configuratie klasse:

@Configuration @EnableWebSecurity openbare klasse SecurityConfig {...}

Laten we de WebSecurityConfigurerAdapter voor de "BEHEERDER" gebruikers:

@Configuration @Order (1) openbare statische klasse App1ConfigurationAdapter breidt WebSecurityConfigurerAdapter uit {openbare App1ConfigurationAdapter () {super (); } @Override protected void configure (HttpSecurity http) gooit uitzondering {http.antMatcher ("/ admin *") .authorizeRequests () .anyRequest () .hasRole ("ADMIN") .and () .formLogin () .loginPage (" / loginAdmin ") .loginProcessingUrl (" / admin_login ") .failureUrl (" / loginAdmin? error = loginError ") .defaultSuccessUrl (" / adminPage ") .and () .logout () .logoutUrl (" / admin_logout ") .logoutSuccessUrl ("/ protectedLinks") .deleteCookies ("JSESSIONID") .and () .exceptionHandling () .accessDeniedPage ("/ 403") .and () .csrf (). disable (); }}

En laten we nu de WebSecurityConfigurerAdapter voor normale gebruikers:

@Configuration @Order (2) openbare statische klasse App2ConfigurationAdapter breidt WebSecurityConfigurerAdapter uit {openbare App2ConfigurationAdapter () {super (); } protected void configure (HttpSecurity http) gooit uitzondering {http.antMatcher ("/ user *") .authorizeRequests () .anyRequest () .hasRole ("USER") .and () .formLogin () .loginPage ("/ loginUser ") .loginProcessingUrl (" / user_login ") .failureUrl (" / loginUser? error = loginError ") .defaultSuccessUrl (" / userPage ") .and () .logout () .logoutUrl (" / user_logout ") .logoutSuccessUrl (" / protectedLinks ") .deleteCookies (" JSESSIONID ") .and () .exceptionHandling () .accessDeniedPage (" / 403 ") .en () .csrf (). disable (); }}

Merk op dat door het plaatsen van de @Bestellen annotatie op elke statische klasse, specificeren we de volgorde waarin de twee klassen zullen worden beschouwd op basis van de patroonovereenkomst wanneer een URL wordt aangevraagd.

Twee configuratieklassen kunnen niet dezelfde volgorde hebben.

3. Aangepaste aanmeldingspagina's

We zullen onze eigen aangepaste inlogpagina's maken voor elk type gebruiker. Voor de administrator-gebruiker heeft het inlogformulier een "gebruiker login" actie, zoals gedefinieerd in de configuratie:

Gebruikersaanmeldingspagina

Gebruiker:
Wachtwoord:

De aanmeldingspagina van de beheerder is vergelijkbaar, behalve dat het formulier een actie heeft van "Admin_login" volgens de java-configuratie.

4. Authenticatieconfiguratie

Nu moeten we authenticatie configureren voor onze applicatie. Laten we eens kijken naar twee manieren om dit te bereiken: de ene met een gemeenschappelijke bron voor gebruikersauthenticatie en de andere met twee afzonderlijke bronnen.

4.1. Een gemeenschappelijke gebruikersauthenticatiebron gebruiken

Als beide aanmeldingspagina's een gemeenschappelijke bron delen voor het verifiëren van gebruikers, kunt u één type bean maken UserDetailsService die de authenticatie zal afhandelen.

Laten we dit scenario demonstreren met een InMemoryUserDetailsManager dat definieert twee gebruikers - een met de rol van "GEBRUIKER" en een met een rol van "BEHEERDER":

@Bean openbare UserDetailsService userDetailsService () genereert Uitzondering {InMemoryUserDetailsManager manager = nieuwe InMemoryUserDetailsManager (); manager.createUser (User .withUsername ("user") .password (encoder (). encode ("userPass")) .roles ("USER") .build ()); manager.createUser (Gebruiker .withUsername ("admin") .password (encoder (). encode ("adminPass")) .roles ("ADMIN") .build ()); terugkeer manager; } @Bean openbare statische PasswordEncoder-encoder () {retourneer nieuwe BCryptPasswordEncoder (); }

4.2. Twee verschillende bronnen voor gebruikersauthenticatie gebruiken

Als u verschillende bronnen voor gebruikersauthenticatie heeft - een voor beheerders en een voor normale gebruikers - kunt u een AuthenticationManagerBuilder binnen elke statische @Configuratie klasse. Laten we eens kijken naar een voorbeeld van een authenticatiemanager voor een "BEHEERDER" gebruiker:

@Configuration @Order (1) openbare statische klasse App1ConfigurationAdapter breidt WebSecurityConfigurerAdapter uit {@Override protected void configure (AuthenticationManagerBuilder auth) gooit Uitzondering {auth.inMemoryAuthentication () .withUser ("admin"). )) .roles ("ADMIN"); }}

In dit geval is het UserDetailsService boon uit de vorige sectie wordt niet meer gebruikt.

6. Conclusie

In deze korte zelfstudie hebben we laten zien hoe u twee verschillende inlogpagina's kunt implementeren in dezelfde Spring Security-applicatie.

De volledige code voor dit artikel is te vinden in het GitHub-project.

Wanneer u de toepassing uitvoert, kunt u de bovenstaande voorbeelden openen op het / protectedLinks URI.