Dua Halaman Login dengan Keamanan Musim Semi

1. Perkenalan

Dalam tutorial ini, kita akan melihat bagaimana kita dapat mengkonfigurasi Spring Security untuk bekerja dengan dua halaman login yang berbeda menggunakan dua elemen http Spring Security yang berbeda dalam konfigurasi tersebut.

2. Mengkonfigurasi 2 Elemen Http

Salah satu situasi di mana kita mungkin memerlukan dua halaman login adalah ketika kita memiliki satu halaman untuk administrator aplikasi dan halaman berbeda untuk pengguna biasa.

Kami akan mengonfigurasi dua elemen http yang akan dibedakan dengan pola URL yang terkait dengan masing-masing:

  • / user * untuk halaman yang membutuhkan otentikasi pengguna biasa agar dapat diakses
  • / admin * untuk halaman yang akan diakses oleh administrator

Setiap elemen http akan memiliki halaman login yang berbeda dan URL pemrosesan login yang berbeda.

Untuk mengonfigurasi dua elemen http yang berbeda , mari buat dua kelas statis yang dianotasi dengan @Configuration yang memperluas WebSecurityConfigurerAdapter .

Keduanya akan ditempatkan di dalam kelas @Configuration biasa :

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

Mari tentukan WebSecurityConfigurerAdapter untuk pengguna "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(); } }

Dan sekarang, mari tentukan WebSecurityConfigurerAdapter untuk pengguna normal:

@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(); } }

Perhatikan bahwa dengan menempatkan anotasi @Order pada setiap kelas statis, kami menentukan urutan di mana dua kelas akan dipertimbangkan berdasarkan pola yang cocok saat URL diminta.

Dua kelas konfigurasi tidak dapat memiliki urutan yang sama.

3. Halaman Login Kustom

Kami akan membuat halaman login kustom kami sendiri untuk setiap jenis pengguna. Untuk pengguna administrator, formulir login akan memiliki tindakan "user_login" , seperti yang didefinisikan dalam konfigurasi:

User login page

User:
Password:

Halaman login administrator serupa, kecuali formulir akan memiliki tindakan "admin_login" sesuai konfigurasi java.

4. Konfigurasi Otentikasi

Sekarang kita perlu mengkonfigurasi otentikasi untuk aplikasi kita . Mari kita lihat dua cara untuk melakukannya - satu menggunakan sumber umum untuk otentikasi pengguna, dan yang lainnya menggunakan dua sumber terpisah.

4.1. Menggunakan Sumber Otentikasi Pengguna Umum

Jika kedua halaman login berbagi sumber yang sama untuk mengautentikasi pengguna, Anda dapat membuat satu kacang jenis UserDetailsService yang akan menangani otentikasi.

Mari kita peragakan skenario ini menggunakan InMemoryUserDetailsManager yang mendefinisikan dua pengguna - satu dengan peran "USER" dan satu lagi dengan peran "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. Menggunakan Dua Sumber Otentikasi Pengguna yang Berbeda

Jika Anda memiliki sumber yang berbeda untuk autentikasi pengguna - satu untuk administrator dan satu untuk pengguna normal - Anda dapat mengonfigurasi AuthenticationManagerBuilder di dalam setiap kelas @Configuration statis . Mari kita lihat contoh manajer otentikasi untuk pengguna "ADMIN" :

@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"); } }

Dalam kasus ini, kacang UserDetailsService dari bagian sebelumnya tidak akan digunakan lagi.

6. Kesimpulan

Dalam tutorial singkat ini, kami telah menunjukkan bagaimana menerapkan dua halaman login berbeda di aplikasi Keamanan Musim Semi yang sama.

Kode lengkap untuk artikel ini dapat ditemukan di proyek GitHub.

Saat Anda menjalankan aplikasi, Anda dapat mengakses contoh di atas pada URI / protectedLinks .