Zwei Anmeldeseiten mit Spring Security

1. Einleitung

In diesem Tutorial erfahren Sie, wie Sie Spring Security so konfigurieren können , dass es mit zwei verschiedenen Anmeldeseiten unter Verwendung von zwei verschiedenen http- Elementen von Spring Security in der Konfiguration funktioniert .

2. Konfigurieren von 2 HTTP-Elementen

Eine der Situationen, in denen wir möglicherweise zwei Anmeldeseiten benötigen, besteht darin, dass wir eine Seite für Administratoren einer Anwendung und eine andere Seite für normale Benutzer haben.

Wir werden zwei http- Elemente konfigurieren , die sich durch das jeweils zugeordnete URL-Muster unterscheiden:

  • / user * für Seiten, für deren Zugriff eine normale Benutzerauthentifizierung erforderlich ist
  • / admin * für Seiten, auf die ein Administrator zugreifen wird

Jedes http- Element hat eine andere Anmeldeseite und eine andere Anmeldeverarbeitungs-URL.

Um zwei verschiedene zu konfigurieren http Elemente, lassen Sie uns erstellen zwei statische Klassen mit Anmerkungen versehen @Configuration , die das erweitern WebSecurityConfigurerAdapter .

Beide werden in eine reguläre @ Configuration- Klasse eingefügt :

@Configuration @EnableWebSecurity public class SecurityConfig { ... }

Definieren wir den WebSecurityConfigurerAdapter für die Benutzer "ADMIN" :

@Configuration @Order(1) public static class App1ConfigurationAdapter extends WebSecurityConfigurerAdapter { public App1ConfigurationAdapter() { super(); } @Override protected void configure(HttpSecurity http) throws Exception { 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(); } }

Und jetzt definieren wir den WebSecurityConfigurerAdapter für normale Benutzer:

@Configuration @Order(2) public static class App2ConfigurationAdapter extends WebSecurityConfigurerAdapter { public App2ConfigurationAdapter() { super(); } protected void configure(HttpSecurity http) throws Exception { 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") .and() .csrf().disable(); } }

Beachten Sie, dass wir durch Platzieren der @ Order- Annotation für jede statische Klasse die Reihenfolge angeben , in der die beiden Klassen basierend auf dem Mustervergleich berücksichtigt werden, wenn eine URL angefordert wird.

Zwei Konfigurationsklassen können nicht dieselbe Reihenfolge haben.

3. Benutzerdefinierte Anmeldeseiten

Wir erstellen für jeden Benutzertyp eigene Anmeldeseiten. Für den Administrator hat das Anmeldeformular eine Aktion "user_login" , wie in der Konfiguration definiert:

User login page

User:
Password:

Die Administrator-Anmeldeseite ist ähnlich, außer dass das Formular gemäß der Java-Konfiguration die Aktion "admin_login" enthält .

4. Authentifizierungskonfiguration

Jetzt müssen wir die Authentifizierung für unsere Anwendung konfigurieren . Schauen wir uns zwei Möglichkeiten an, um dies zu erreichen: eine mit einer gemeinsamen Quelle für die Benutzerauthentifizierung und die andere mit zwei separaten Quellen.

4.1. Verwenden einer allgemeinen Benutzerauthentifizierungsquelle

Wenn beide Anmeldeseiten eine gemeinsame Quelle für die Authentifizierung von Benutzern haben, können Sie eine einzelne Bean vom Typ UserDetailsService erstellen , die die Authentifizierung übernimmt.

Lassen Sie uns dieses Szenario anhand eines InMemoryUserDetailsManager demonstrieren , der zwei Benutzer definiert - einen mit der Rolle "USER" und einen mit der Rolle "ADMIN" :

@Bean public UserDetailsService userDetailsService() throws Exception { InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); manager.createUser(User .withUsername("user") .password(encoder().encode("userPass")) .roles("USER") .build()); manager.createUser(User .withUsername("admin") .password(encoder().encode("adminPass")) .roles("ADMIN") .build()); return manager; } @Bean public static PasswordEncoder encoder() { return new BCryptPasswordEncoder(); }

4.2. Verwenden von zwei verschiedenen Benutzerauthentifizierungsquellen

Wenn Sie unterschiedliche Quellen für die Benutzerauthentifizierung haben - eine für Administratoren und eine für normale Benutzer - können Sie in jeder statischen @ Configuration- Klasse einen AuthenticationManagerBuilder konfigurieren . Schauen wir uns ein Beispiel eines Authentifizierungsmanagers für einen ADMIN- Benutzer an:

@Configuration @Order(1) public static class App1ConfigurationAdapter extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("admin") .password(encoder().encode("admin")) .roles("ADMIN"); } }

In diesem Fall wird die UserDetailsService- Bean aus dem vorherigen Abschnitt nicht mehr verwendet.

6. Fazit

In diesem kurzen Tutorial haben wir gezeigt, wie zwei verschiedene Anmeldeseiten in derselben Spring Security-Anwendung implementiert werden.

Den vollständigen Code für diesen Artikel finden Sie im GitHub-Projekt.

Wenn Sie die Anwendung ausführen, können Sie auf die obigen Beispiele im URI / protectedLinks zugreifen .