Keamanan Musim Semi: Otentikasi dengan UserDetailsService yang didukung Database

1. Ikhtisar

Pada artikel ini, kami akan menunjukkan cara membuat UserDetailsService yang didukung database kustom untuk otentikasi dengan Spring Security.

2. UserDetailsService

The UserDetailsService antarmuka digunakan untuk mengambil data terkait pengguna. Ini memiliki satu metode bernama loadUserByUsername () yang dapat diganti untuk menyesuaikan proses menemukan pengguna.

Ini digunakan oleh DaoAuthenticationProvider untuk memuat detail tentang pengguna selama otentikasi.

3. Model Pengguna

Untuk menyimpan pengguna, kami akan membuat entitas Pengguna yang dipetakan ke tabel database, dengan atribut berikut:

@Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(nullable = false, unique = true) private String username; private String password; // standard getters and setters }

4. Mengambil Pengguna

Untuk tujuan mengambil pengguna yang terkait dengan nama pengguna, kami akan membuat kelas DAO menggunakan Spring Data dengan memperluas antarmuka JpaRepository :

public interface UserRepository extends JpaRepository { User findByUsername(String username); }

5. UserDetailsService

Untuk menyediakan layanan pengguna kita sendiri, kita perlu mengimplementasikan antarmuka UserDetailsService .

Kita akan membuat kelas bernama MyUserDetailsService yang menggantikan metode loadUserByUsername () dari antarmuka.

Dalam metode ini, kami mengambil objek User menggunakan DAO , dan jika ada, bungkus ke dalam objek MyUserPrincipal , yang mengimplementasikan UserDetails , dan mengembalikannya:

@Service public class MyUserDetailsService implements UserDetailsService { @Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) { User user = userRepository.findByUsername(username); if (user == null) { throw new UsernameNotFoundException(username); } return new MyUserPrincipal(user); } }

Mari kita tentukan kelas MyUserPrincipal sebagai berikut:

public class MyUserPrincipal implements UserDetails { private User user; public MyUserPrincipal(User user) { this.user = user; } //... }

6. Konfigurasi Pegas

Kami akan mendemonstrasikan kedua jenis konfigurasi Spring: XML dan berbasis anotasi, yang diperlukan untuk menggunakan implementasi UserDetailsService kustom kami .

6.1. Konfigurasi Anotasi

Yang perlu kita lakukan untuk mengaktifkan UserDetailsService kustom kita adalah menambahkannya ke konteks aplikasi kita sebagai kacang.

Karena kita mengkonfigurasi kelas kita dengan anotasi @Service , aplikasi akan secara otomatis mendeteksinya selama pemindaian komponen, dan itu akan membuat kacang dari kelas ini. Oleh karena itu, tidak ada hal lain yang perlu kita lakukan di sini.

Sebagai alternatif, kami dapat:

  • mengkonfigurasinya di authenticationManager menggunakan AuthenticationManagerBuilder # userDetailsService metode
  • mengaturnya sebagai properti di kustom authenticationProvider kacang, dan kemudian menyuntikkan bahwa menggunakan AuthenticationManagerBuilder # authenticationProvider fungsi

6.2. Konfigurasi XML

Di sisi lain, untuk konfigurasi XML kita perlu mendefinisikan kacang dengan tipe MyUserDetailsService , dan memasukkannya ke dalam kacang penyedia otentikasi Spring :

7. Opsi Otentikasi yang Didukung Database Lainnya

The AuthenticationManagerBuilder penawaran satu metode lain untuk otentikasi berbasis JDBC configure dalam aplikasi kita.

Kita harus mengonfigurasi AuthenticationManagerBuilder.jdbcAuthentication dengan instance DataSource . Jika database kita mengikuti Skema Pengguna Musim Semi, maka konfigurasi default akan cocok untuk kita.

Kami telah melihat konfigurasi dasar menggunakan pendekatan ini di posting sebelumnya.

The JdbcUserDetailsManager entitas yang dihasilkan dari konfigurasi ini mengimplementasikan UserDetailsService juga.

Hasilnya, kita dapat menyimpulkan bahwa konfigurasi ini lebih mudah diterapkan, terutama jika kita menggunakan Spring Boot yang secara otomatis mengonfigurasi Sumber Data untuk kita.

Jika kami memerlukan, bagaimanapun, tingkat fleksibilitas yang lebih tinggi, menyesuaikan persis bagaimana aplikasi akan mengambil detail pengguna, maka kami akan memilih pendekatan yang kami ikuti dalam tutorial ini.

8. Kesimpulan

Singkatnya, dalam artikel ini kami telah menunjukkan cara membuat UserDetailsService kustom berbasis Spring yang didukung oleh data persisten.

Implementasinya dapat ditemukan di proyek GitHub - ini adalah proyek berbasis Maven, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.