Pengenalan Java Config untuk Spring Security

1. Gambaran keseluruhan

Artikel ini adalah pengenalan konfigurasi Java untuk Spring Security yang membolehkan pengguna mengkonfigurasi Spring Security dengan mudah tanpa menggunakan XML .

Konfigurasi Java ditambahkan ke kerangka Spring pada Spring 3.1 dan diperluas ke Spring Security pada Spring 3.2 dan didefinisikan dalam kelas yang diberi penjelasan @Configuration .

2. Persediaan Maven

Untuk menggunakan Spring Security dalam projek Maven, pertama-tama kita perlu mempunyai pergantungan inti keselamatan-spring dalam projek pom.xml :

 org.springframework.security spring-security-core 5.3.3.RELEASE 

Versi terbaru boleh didapati di sini.

3. Keselamatan Web Dengan Konfigurasi Java

Mari kita mulakan dengan contoh asas konfigurasi Spring Security Java:

@EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("user") .password(passwordEncoder().encode("password")).roles("USER"); } }

Seperti yang anda perhatikan, konfigurasi menyediakan konfigurasi pengesahan dalam memori asas. Selain itu, mulai Spring 5, kami memerlukan kacang PasswordEncoder :

@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }

4. Keselamatan HTTP

Untuk mengaktifkan HTTP Security pada musim bunga, kita perlu memperluas WebSecurityConfigurerAdapter untuk menyediakan konfigurasi lalai dalam kaedah configure (HttpSecurity http) :

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and().httpBasic(); } 

Konfigurasi lalai di atas memastikan setiap permintaan ke aplikasi disahkan dengan log masuk berasaskan borang atau pengesahan asas HTTP.

Juga sama persis dengan konfigurasi XML berikut:

5. Log Masuk Borang

Menariknya, Spring Security menghasilkan halaman masuk secara automatik, berdasarkan ciri yang diaktifkan dan menggunakan nilai standard untuk URL yang memproses log masuk yang dihantar:

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and().formLogin() .loginPage("/login").permitAll(); }

Di sini halaman log masuk yang dihasilkan secara automatik adalah senang untuk bangun dan berjalan dengan cepat.

6. Kebenaran Dengan Peranan

Mari sekarang konfigurasikan beberapa kebenaran mudah pada setiap URL menggunakan peranan:

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/", "/home").access("hasRole('USER')") .antMatchers("/admin/**").hasRole("ADMIN") .and() // some more method calls .formLogin(); }

Perhatikan bagaimana kita menggunakan API jenis selamat - hasRole - tetapi juga API berasaskan ekspresi, melalui akses.

7. Log keluar

Seperti aspek lain dari Spring Security, logout mempunyai beberapa lalai besar yang disediakan oleh rangka kerja.

Secara lalai, permintaan logout membatalkan sesi, membersihkan cache pengesahan, membersihkan SecurityContextHolder dan mengalihkan ke halaman log masuk.

Berikut adalah konfigurasi log keluar yang mudah:

protected void configure(HttpSecurity http) throws Exception { http.logout(); }

Walau bagaimanapun, jika anda ingin mendapatkan lebih banyak kawalan ke atas pengendali yang ada, berikut adalah pelaksanaan yang lebih lengkap seperti:

protected void configure(HttpSecurity http) throws Exception { http.logout().logoutUrl("/my/logout") .logoutSuccessUrl("/my/index") .logoutSuccessHandler(logoutSuccessHandler) .invalidateHttpSession(true) .addLogoutHandler(logoutHandler) .deleteCookies(cookieNamesToClear) .and() // some other method calls }

8. Pengesahan

Mari kita lihat cara lain untuk membenarkan pengesahan dengan Spring Security.

8.1. Pengesahan Dalam Memori

Kami akan mulakan dengan konfigurasi dalam memori yang mudah:

@Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user").password(passwordEncoder().encode("password")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN"); } 

8.2. Pengesahan JDBC

Untuk memindahkannya ke JDBC, yang harus anda lakukan adalah menentukan sumber data dalam aplikasi - dan menggunakannya secara langsung:

@Autowired private DataSource dataSource; @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.jdbcAuthentication().dataSource(dataSource) .withDefaultSchema() .withUser("user").password(passwordEncoder().encode("password")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN"); } 

Sudah tentu, dengan kedua-dua contoh di atas, kita juga perlu menentukan kacang PasswordEncoder seperti yang digariskan dalam Bahagian 3.

9. Kesimpulannya

Dalam tutorial ringkas ini, kami membahas asas-asas Konfigurasi Java untuk Spring Security dan memfokuskan pada contoh kod yang menggambarkan senario konfigurasi termudah.