Dua Halaman Log Masuk dengan Keselamatan Musim Semi

1. Pengenalan

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

2. Mengkonfigurasi 2 Elemen Http

Salah satu situasi di mana kita mungkin memerlukan dua halaman log masuk adalah ketika kita memiliki satu halaman untuk pentadbir aplikasi dan halaman yang berbeda untuk pengguna normal.

Kami akan mengkonfigurasi dua elemen http yang akan dibezakan dengan corak URL yang berkaitan dengan masing-masing:

  • / pengguna * untuk halaman yang memerlukan pengesahan pengguna biasa untuk diakses
  • / admin * untuk halaman yang akan diakses oleh pentadbir

Setiap elemen http akan mempunyai halaman log masuk yang berbeza dan URL pemprosesan log masuk yang berbeza.

Untuk mengkonfigurasi dua elemen http yang berbeza , mari buat dua kelas statik yang diberi penjelasan dengan @Configuration yang memperluas WebSecurityConfigurerAdapter .

Kedua-duanya akan ditempatkan di kelas @Configuration biasa :

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

Mari kita 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 kita tentukan WebSecurityConfigurerAdapter untuk pengguna biasa:

@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 bahawa dengan meletakkan anotasi @Order pada setiap kelas statik, kami menentukan urutan di mana kedua kelas akan dipertimbangkan berdasarkan padanan corak ketika URL diminta.

Dua kelas konfigurasi tidak boleh mempunyai susunan yang sama.

3. Halaman Log Masuk Tersuai

Kami akan membuat halaman log masuk tersendiri untuk setiap jenis pengguna. Untuk pengguna pentadbir, borang log masuk akan mempunyai tindakan "user_login" , seperti yang ditentukan dalam konfigurasi:

User login page

User:
Password:

Halaman log masuk pentadbir serupa, kecuali formulir akan memiliki tindakan "admin_login" sesuai konfigurasi java.

4. Konfigurasi Pengesahan

Sekarang kita perlu mengkonfigurasi pengesahan untuk aplikasi kita . Mari kita lihat dua cara untuk mencapai ini - satu menggunakan sumber biasa untuk pengesahan pengguna, dan yang lain menggunakan dua sumber yang berasingan.

4.1. Menggunakan Sumber Pengesahan Pengguna Umum

Sekiranya kedua-dua halaman masuk berkongsi sumber yang sama untuk mengesahkan pengguna, anda boleh membuat satu jenis jenis UserDetailsService yang akan menangani pengesahan.

Mari tunjukkan senario ini menggunakan InMemoryUserDetailsManager yang menentukan dua pengguna - satu dengan peranan "PENGGUNA" dan satu dengan peranan "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 Pengesahan Pengguna yang berbeza

Sekiranya anda mempunyai sumber yang berbeza untuk pengesahan pengguna - satu untuk pentadbir dan satu untuk pengguna biasa - anda boleh mengkonfigurasi AuthenticationManagerBuilder di dalam setiap kelas @Konfigurasi statik . Mari kita lihat contoh pengurus pengesahan 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 kes ini, kacang UserDetailsService dari bahagian sebelumnya tidak akan digunakan lagi.

6. Kesimpulannya

Dalam tutorial ringkas ini, kami telah menunjukkan cara menerapkan dua halaman log masuk yang berbeza dalam aplikasi Spring Security yang sama.

Kod lengkap untuk artikel ini boleh didapati di projek GitHub.

Semasa anda menjalankan aplikasi, anda boleh mengakses contoh di atas pada URI / protectedLinks .