Pastikan keamanan aplikasi Spring Anda dengan memanfaatkan fitur tangguh yang ditawarkan oleh kerangka kerja Spring Security.
Kerangka kerja Spring Security mengamankan aplikasi Anda melalui autentikasi dan otorisasi. Dalam keadaan defaultnya, Spring Security memastikan bahwa setiap jalur permintaan HTTP (atau halaman) di aplikasi Anda memerlukan autentikasi dari satu pengguna global.
Framework ini juga sangat fleksibel. Ini memungkinkan Anda membuat aturan keamanan khusus untuk setiap jalur permintaan HTTP di aplikasi Anda, serta pengguna yang berbeda. Jadi, Anda dapat menghapus batasan keamanan pada halaman yang tidak memerlukan otorisasi pengguna (seperti halaman beranda). Dan atur peran dan otoritas jenis pengguna tertentu.
Menambahkan Keamanan Pegas ke Aplikasi Anda
Ada dua cara untuk menambahkan Spring Security ke aplikasi Anda. Anda dapat memilihnya sebagai ketergantungan saat membuat aplikasi Spring Boot baru menggunakan inisialisasi Spring, atau tambahkan ke file spesifikasi build Anda di bagian dependensi setelah membuat proyek Anda.
Jika Anda memilih salah satu opsi proyek Gradle, maka file dependensinya adalah build.gradle. Namun, jika Anda memilih Maven, maka file tersebut adalah pom.xml.
Milikmu build.gradle file harus berisi ketergantungan berikut:
dependencies {
implementation 'org.springframework.boot: spring-boot-starter-security'
}
Sementara pom.xml file harus berisi ketergantungan berikut:
org.springframework.boot
spring-boot-starter-security
Contoh aplikasi yang digunakan dalam artikel tersedia di sini repositori GitHub dan gratis untuk Anda gunakan di bawah lisensi MIT.
Menggunakan Keamanan Musim Semi
Setelah Anda menambahkan dependensi Spring Security ke aplikasi Anda, Anda dapat segera mulai menggunakan framework. Cukup jalankan aplikasi Anda lalu navigasikan ke halaman utama Spring Boot (atau halaman apa pun di aplikasi Anda). Contoh aplikasi menggunakan pengontrol awal berikut untuk mengontrol default Spring Boot host lokal: 8080 meminta:
package com.springSecurityDemo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
publicclassWebController{
@GetMapping("/")
public String home(){
return"Welcome!";
}
}
Mengeksekusi aplikasi Anda setelah menambahkan kelas pengontrol tunggal di atas menghasilkan tampilan awal berikut:
Anda akan melihat bahwa secara otomatis mengarahkan Anda ke localhost: 8080/masuk halaman, dan ini dilakukan sebelum memungkinkan Anda untuk mengakses halaman aplikasi lainnya. Pada tahap ini, Anda harus memberikan nama pengguna default (yaitu pengguna) dan kata sandi yang dibuat secara otomatis (yang akan Anda temukan di konsol). Konsol akan menghasilkan garis seperti berikut:
Using generated security password: c4070465-4c65-4e72-8c3f-3800e631ba81
Setiap kali Anda memulai ulang aplikasi, kata sandi yang dibuat secara otomatis akan berubah, tetapi nama pengguna akan tetap sama. Memasukkan nama pengguna dan kata sandi default akan mengarahkan Anda ke tampilan yang sesuai di aplikasi Anda.
Menyesuaikan Keamanan Musim Semi
Untuk menyesuaikan keamanan aplikasi Anda, Anda harus mengganti konfigurasi default Spring Security. Namun sebelum itu (dengan asumsi Anda sudah memiliki Spring Web), Anda memerlukan beberapa dependensi lain untuk contoh aplikasi ini:
- Musim Semi Data JPA
- Driver JDBC MySQL
- daun thyme
- Lombok
Kerangka kerja Thymeleaf akan menghasilkan tampilan yang berbeda. Lombok akan membantu mengurangi kode di kelas objek Anda. Pustaka JPA dan driver MySQL akan memungkinkan Anda untuk menggunakan database MySQL dengan aplikasi tersebut, tetapi Anda memiliki opsi untuk menggunakan database apa pun yang nyaman bagi Anda. Menggunakan database berarti mengkonfigurasi aplikasi.properti file di bawah file sumber daya.
spring.datasource.url=jdbc: mysql://${MYSQL_HOST: localhost}:3306/spring_security
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
Kode konfigurasi di atas memungkinkan Anda untuk terhubung ke database MySQL lokal yang disebut spring_security, dengan nama pengguna dari akar, dan kata sandi (1234). Anda harus memperbarui data ini agar cocok dengan nama database dan kredensial Anda.
Setelah menambahkan dependensi tambahan dan membuat database, Anda dapat mulai memutuskan berapa banyak tampilan yang akan dimiliki aplikasi Anda. Anda juga perlu mengetahui seperti apa keamanan untuk setiap halaman. Contoh aplikasi kami memiliki 6 tampilan:
- Halaman Beranda
- Halaman Pendaftaran
- Halaman masuk
- Halaman Keluar
- Halaman Pengguna
- Halaman Kesalahan
Satu-satunya tampilan yang memerlukan otorisasi pengguna adalah halaman pengguna. Halaman ini hanya dapat diakses oleh pengguna yang terlebih dahulu mendaftar, kemudian masuk ke aplikasi. Selain paket default Spring Boot, Anda harus membuat empat paket lain di aplikasi Anda.
Kelas Pengendali Registrasi
Paket pengontrol akan berisi kelas-kelas yang menangani permintaan HTTP. Bergantung pada fungsi halaman, Anda biasanya dapat mengelompokkan setiap permintaan HTTP ke dalam satu kelas pengontrol, seperti halnya dengan WebController kelas. Namun, tampilan registrasi memiliki fungsi yang lebih unik, sehingga dapat memiliki kelas pengontrol privat:
@Controller
@RequestMapping("/register")
publicclassRegistrationController{
private UserRepository userRepo;
private PasswordEncoder passwordEncoder;
publicRegistrationController( UserRepository userRepo, PasswordEncoder passwordEncoder){
this.userRepo = userRepo;
this.passwordEncoder = passwordEncoder;
}
@GetMapping
public String registerForm(){
return"registration";
}
@PostMapping
public String processRegistration(RegistrationForm form){
userRepo.save(form.toUser(passwordEncoder));
return"redirect:/login";
}
}
Itu RegistrationController class adalah pintu gerbang ke aspek keamanan aplikasi Anda. Itu @RequestMapping anotasi menentukan jenis permintaan yang akan ditangani pengontrol ini (permintaan ke localhost: 8080/daftar).
Itu @Dapatkan Pemetaan anotasi hanya menunjukkan bahwa jika aplikasi menerima permintaan untuk /register, itu formulir pendaftaran() metode harus menangani permintaan itu dengan mengembalikan tampilan pendaftaran.
Setelah pengunjung mengklik tombol daftar, maka @PostMapping anotasi mulai berlaku. Itu prosesRegistrasi() metode memungkinkan Anda untuk memposting data pengguna yang didapat dari Formulir pendaftaran kelas ke database, menggunakan Repositori Pengguna kelas. Namun sebelum menyimpan data ini, file prosesRegistrasi() metode mengenkripsi kata sandi pengguna menggunakan musim semiPasswordEncoder antarmuka.
Membuat Konfigurasi Keamanan Baru
Sejak Spring 3.1, developer sekarang dapat membuat konfigurasi untuk Spring Security menggunakan Java, yang berarti class, bukan XML. Hal utama yang dibutuhkan kelas konfigurasi ini adalah @Konfigurasi anotasi.
@Configuration
publicclassSecurityConfiguration{
}
Itu @Konfigurasi anotasi menunjukkan bahwa kelas di atas adalah kelas konfigurasi. Kelas-kelas ini menyediakan kacang untuk Konteks aplikasi musim semi, yang merupakan wadah yang digunakan Spring untuk membuat dan mengelola berbagai komponen (atau kacang) aplikasi. Kacang pertama di Konfigurasi Keamanan kelas adalah passwordEncoder kacang.
@Bean
public PasswordEncoder passwordEncoder(){
returnnew BCryptPasswordEncoder();
}
Itu RegistrationController kelas menggunakan passwordEncoder bean untuk menyandikan kata sandi baru sebelum menyimpannya ke database. Kacang penting lainnya yang perlu Anda tambahkan ke Konfigurasi Keamanan kelas adalah userDetailsService kacang.
@Bean
public UserDetailsService userDetailsService(UserRepository userRepo){
return username -> {
Customer customer = userRepo.findByUsername(username);
if (customer != null)
return customer;
thrownew UsernameNotFoundException("Customer '" + username + "' not found");
};
}
Itu userDetailsService kacang mempekerjakan Keamanan Musim SemiUserDetailsService antarmuka untuk mengambil nama pengguna dan kata sandi pengguna untuk otentikasi, selama sesi login pelanggan. Jadi, segera setelah pelanggan mengklik tombol login di tampilan login, userDetailsService kacang mulai bergerak.
Melalui Repositori Pengguna, itu userDetailsService bean mendapatkan akses ke semua pelanggan yang ada di database. Antarmuka ini kemudian menggunakan Repositori Pengguna untuk menemukan pengguna dengan nama pengguna dan kata sandi yang cocok, lalu mengembalikan semua atribut pelanggan ini sebagai objek.
Jika objek yang dikembalikan adalah pelanggan, maka pelanggan ini mendapatkan akses ke aplikasi. Jika tidak, halaman akan disegarkan secara otomatis sehingga memungkinkan pengguna memasukkan kredensial yang valid.
Rantai Filter
Keamanan Musim SemiSecurityFilterChain antarmuka adalah berguna antarmuka pemrograman aplikasi (API) yang memainkan peran penting dalam konfigurasi Spring Security. Antarmuka ini bekerja dengan Keamanan Musim SemiHttpSecurity kelas untuk membuat rantai filter untuk permintaan HTTP tertentu.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http)throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/user").hasAuthority("USER").anyRequest().permitAll())
.formLogin(formLogin -> formLogin
.loginPage("/login").defaultSuccessUrl("/user", true))
.logout(logout -> logout.logoutSuccessUrl("/logout"));
return http.build();
}
Itu filterChain kacang di atas menggunakan SecurityFilterChain API untuk menyelesaikan beberapa tugas. Pertama, ini menggunakan HttpSecurity kelas untuk menentukan bahwa hanya pengguna yang memiliki peran PENGGUNA yang dapat mengakses localhost: 8080/pengguna. Dan pengguna mendapatkan peran ini setelah pendaftaran, berkat getAuthorities() metode yang diterapkan oleh setiap objek pelanggan baru.
@Override
public Collection extends="extends" grantedauthority="grantedauthority"?> getAuthorities() {
return Arrays.asList(new SimpleGrantedAuthority("USER"));
}
Rantai filter memungkinkan akses yang tidak diautentikasi ke semua URL lain dalam aplikasi. Itu filterChain kacang juga memanfaatkan formLogin() Dan keluar() metode dari HttpSecurity objek kelas.
Metode ini memungkinkan Anda mengarahkan pengguna secara otomatis ke halaman tertentu setelah mereka melakukan tugas. Jadi, pengguna yang memasukkan kredensial yang benar dan mengklik tombol login di /login halaman akan secara otomatis diarahkan ke /user halaman.
Akhirnya, filterChain bean membangun dan mengembalikan rantai filter, yang memungkinkan pengguna yang berwenang untuk mengakses aplikasi. Ketiga kacang di Konfigurasi Keamanan kelas bekerja sama untuk mengamankan aplikasi Anda.
Namun, filterChain kacang memainkan peran yang lebih signifikan mendikte tingkat otorisasi untuk setiap permintaan HTTP. Saat Anda mulai menambahkan lebih banyak halaman ke aplikasi Anda, Anda dapat menggunakan filterChain kacang untuk mengatur tingkat keamanan mereka.
Manfaat Utama Keamanan Musim Semi
Spring Security memberi Anda kendali penuh tidak hanya atas siapa yang memiliki akses ke aplikasi Anda, tetapi juga jenis akses yang dapat dimiliki pengguna (melalui fitur peran penggunanya). Kontrol akses adalah salah satu aspek terpenting dari aplikasi apa pun. Memberi pengguna umum akses tanpa filter ke aplikasi Anda karena hambatan kontrol akses yang terbatas mungkin merupakan kesalahan yang merugikan.