Spring Security: Pengesahan dengan UserDetailsService yang disokong oleh Pangkalan Data

1. Gambaran keseluruhan

Dalam artikel ini, kami akan menunjukkan cara membuat UserDetailsService yang disokong pangkalan data khusus untuk pengesahan dengan Spring Security.

2. UserDetailsService

Antara muka UserDetailsService digunakan untuk mengambil data yang berkaitan dengan pengguna. Ia mempunyai satu kaedah bernama loadUserByUsername () yang boleh diganti untuk menyesuaikan proses mencari pengguna.

Ia digunakan oleh DaoAuthenticationProvider untuk memuatkan perincian mengenai pengguna semasa pengesahan.

3. Model Pengguna

Untuk menyimpan pengguna, kami akan membuat entiti Pengguna yang dipetakan ke jadual pangkalan data, 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 mendapatkan pengguna yang dikaitkan dengan nama pengguna, kami akan membuat kelas DAO menggunakan Spring Data dengan memperluaskan antara muka JpaRepository :

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

5. Perkhidmatan UserDetails

Untuk menyediakan perkhidmatan pengguna kita sendiri, kita perlu melaksanakan antara muka UserDetailsService .

Kami akan membuat kelas bernama MyUserDetailsService yang mengatasi kaedah loadUserByUsername () antara muka.

Dalam kaedah ini, kami mengambil objek Pengguna menggunakan DAO , dan jika ada, bungkusnya ke objek MyUserPrincipal , yang menerapkan 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 tentukan kelas MyUserPrinsipal seperti berikut:

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

6. Konfigurasi Musim Bunga

Kami akan menunjukkan kedua-dua jenis konfigurasi Spring: berasaskan XML dan anotasi, yang diperlukan untuk menggunakan pelaksanaan CustomDetailsService kami .

6.1. Konfigurasi Anotasi

Yang perlu kita lakukan untuk membolehkan UserDetailsService tersuai adalah menambahkannya ke konteks aplikasi kita sebagai kacang.

Oleh kerana kami mengkonfigurasi kelas kami dengan anotasi @Service , aplikasi akan mengesannya secara automatik semasa imbasan komponen, dan ia akan menghasilkan kacang dari kelas ini. Oleh itu, tidak ada perkara lain yang perlu kita lakukan di sini.

Sebagai alternatif, kami boleh:

  • menatarajah dalam authenticationManager menggunakan AuthenticationManagerBuilder # userDetailsService kaedah
  • menetapkan ia sebagai harta di rekaan authenticationProvider kacang, dan kemudian menyuntik bahawa menggunakan AuthenticationManagerBuilder # authenticationProvider fungsi

6.2. Konfigurasi XML

Sebaliknya, untuk konfigurasi XML kita perlu menentukan kacang dengan jenis MyUserDetailsService , dan memasukkannya ke dalam kacang penyedia pengesahan Spring :

7. Pilihan Pengesahan yang disokong pangkalan data lain

The AuthenticationManagerBuilder menawarkan satu kaedah lain untuk mengkonfigurasi pengesahan berasaskan JDBC dalam aplikasi kami.

Kita perlu mengkonfigurasi AuthenticationManagerBuilder.jdbcAuthentication dengan instance DataSource . Sekiranya pangkalan data kami mengikuti Skema Pengguna Musim Semi, konfigurasi lalai akan sesuai dengan kami.

Kami telah melihat konfigurasi asas menggunakan pendekatan ini dalam catatan sebelumnya.

The JdbcUserDetailsManager entiti yang disebabkan daripada konfigurasi ini melaksanakan UserDetailsService juga.

Hasilnya, kita dapat menyimpulkan bahawa konfigurasi ini lebih mudah dilaksanakan, terutama jika kita menggunakan Spring Boot yang secara automatik mengkonfigurasi Sumber Data untuk kita.

Sekiranya kita memerlukan, bagaimanapun, tahap fleksibilitas yang lebih tinggi, menyesuaikan dengan tepat bagaimana aplikasi akan mengambil perincian pengguna, maka kita akan memilih pendekatan yang kita ikuti dalam tutorial ini.

8. Kesimpulannya

Ringkasnya, dalam artikel ini kami telah menunjukkan cara membuat UserDetailsService berasaskan Spring khusus yang disokong oleh data berterusan.

Pelaksanaannya dapat dijumpai dalam projek GitHub - ini adalah projek berasaskan Maven, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.