Dvije stranice za prijavu s proljetnom sigurnošću

1. Uvod

U ovom uputstvu vidjet ćemo kako možemo konfigurirajte Spring Security za rad s dvije različite stranice za prijavu koristeći dvije različite Spring Security http elementi u konfiguraciji.

2. Konfiguriranje 2 Http elementa

Jedna od situacija u kojoj će nam trebati dvije stranice za prijavu je kada imamo jednu stranicu za administratore aplikacije i drugu stranicu za uobičajene korisnike.

Hoćemo konfigurirati dva http elementi koji će se razlikovati prema uzorku URL-a povezanom sa svakim:

  • /korisnik* za stranice kojima će biti potrebna uobičajena provjera autentičnosti korisnika
  • / admin * za stranice kojima će pristupiti administrator

Svaki http element će imati drugu stranicu za prijavu i drugačiji URL za obradu prijave.

Kako bi se konfigurirala dva različita http elementi, stvorimo dvije statičke klase označene sa @Konfiguracija koji produžuju WebSecurityConfigurerAdapter.

Oboje će biti smješteni unutar regularnog dijela @Konfiguracija razred:

@Configuration @EnableWebSecurity javna klasa SecurityConfig {...}

Definirajmo WebSecurityConfigurerAdapter za "UPRAVNIK" korisnici:

@Configuration @Order (1) javna statička klasa App1ConfigurationAdapter proširuje WebSecurityConfigurerAdapter {public App1ConfigurationAdapter () {super (); } @Override zaštićena void konfiguracija (HttpSecurity http) baca iznimku {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 ") .logoutSuccessUr ("/ protectedLinks") .deleteCookies ("JSESSIONID") .and () .exceptionHandling () .accessDeniedPage ("/ 403") .and () .csrf (). disable (); }}

A sada, definirajmo WebSecurityConfigurerAdapter za normalne korisnike:

@Configuration @Order (2) javna statička klasa App2ConfigurationAdapter proširuje WebSecurityConfigurerAdapter {public App2ConfigurationAdapter () {super (); } zaštićena void konfiguracija (HttpSecurity http) baca izuzetak {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 (); }}

Imajte na umu da postavljanjem @Narudžba napomena za svaku statičku klasu, određujemo redoslijed kojim će se dvije klase razmatrati na temelju uzorka koji se podudara kada se traži URL.

Dvije konfiguracijske klase ne mogu imati isti redoslijed.

3. Prilagođene stranice za prijavu

Izradit ćemo vlastite prilagođene stranice za prijavu za svaku vrstu korisnika. Za administratora, obrazac za prijavu imat će "User_login" akcija, kako je definirano u konfiguraciji:

Stranica za prijavu korisnika

Korisnik:
Zaporka:

Stranica za prijavu administratora je slična, osim što će obrazac imati radnju od "Admin_login" prema java konfiguraciji.

4. Konfiguracija provjere autentičnosti

Sad moramo konfigurirajte provjeru autentičnosti za našu aplikaciju. Pogledajmo dva načina kako to postići - jedan pomoću zajedničkog izvora za provjeru autentičnosti korisnika, a drugi pomoću dva odvojena izvora.

4.1. Korištenje uobičajenog izvora autentifikacije korisnika

Ako obje stranice za prijavu dijele zajednički izvor za provjeru autentičnosti korisnika, možete stvoriti jedan grah vrste UserDetailsService koji će se baviti provjerom autentičnosti.

Pokažimo ovaj scenarij pomoću InMemoryUserDetailsManager koji definira dva korisnika - jedan s ulogom "KORISNIK" i jedan s ulogom "UPRAVNIK":

@Bean public UserDetailsService userDetailsService () baca iznimku {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 ()); upravitelj povratka; } @Bean javni statički koder PasswordEncoder () {vratiti novi BCryptPasswordEncoder (); }

4.2. Korištenje dva različita izvora autentifikacije korisnika

Ako imate različite izvore za autentifikaciju korisnika - jedan za administratore i jedan za normalne korisnike, možete konfigurirati AuthenticationManagerBuilder unutar svake statičke @Konfiguracija razred. Pogledajmo primjer upravitelja provjere autentičnosti za "UPRAVNIK" korisnik:

@Configuration @Order (1) javna statička klasa App1ConfigurationAdapter proširuje WebSecurityConfigurerAdapter {@Override zaštićena void konfiguracija (AuthenticationManagerBuilder auth) baca izuzetak {auth.inMemoryAuthentication () .withUser ("admin"). )) .roles ("ADMINISTRATOR"); }}

U ovom slučaju, UserDetailsService grah iz prethodnog odjeljka više se neće koristiti.

6. Zaključak

U ovom smo brzom vodiču pokazali kako implementirati dvije različite stranice za prijavu u isti program Spring Security.

Cjelovit kôd za ovaj članak nalazi se u projektu GitHub.

Kada pokrenete aplikaciju, možete pristupiti gornjim primjerima na / protectedLinks URI.


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