Proljetna sigurnost: provjera autentičnosti pomoću UserDetailsService podržane bazom podataka

1. Pregled

U ovom ćemo članku pokazati kako stvoriti prilagođenu bazu podataka UserDetailsService za provjeru autentičnosti s Spring Security.

2. UserDetailsService

The UserDetailsService sučelje se koristi za dohvat podataka koji se odnose na korisnika. Ima jednu metodu nazvanu loadUserByUsername () koje se mogu nadjačati kako bi se prilagodio postupak pronalaska korisnika.

Koristi ga DaoAuthenticationProvider za učitavanje detalja o korisniku tijekom provjere autentičnosti.

3. The Korisnik Model

Za spremanje korisnika stvorit ćemo Korisnik entitet koji se preslikava u tablicu baze podataka, sa sljedećim atributima:

@Entity javna klasa Korisnik {@Id @GeneratedValue (strategy = GenerationType.AUTO) private Long id; @Column (nullable = false, unique = true) privatno korisničko ime niza; privatna lozinka za niz; // standardni geteri i postavljači}

4. Dohvaćanje korisnika

U svrhu dohvaćanja korisnika povezanog s korisničkim imenom, stvorit ćemo DAO razred koristeći Proljetni podaci proširivanjem JpaRepository sučelje:

javno sučelje UserRepository proširuje JpaRepository {User findByUsername (korisničko ime niza); }

5. The UserDetailsService

Da bismo mogli pružiti vlastitu korisničku uslugu, morat ćemo implementirati UserDetailsService sučelje.

Stvorit ćemo razred koji se zove MyUserDetailsService to nadjačava metodu loadUserByUsername () sučelja.

Ovom metodom dohvaćamo Korisnik objekt pomoću DAO, i ako postoji, zamotajte ga u MyUserPrincipal objekt, koji provodi Pojedinosti o korisniku, i vraća ga:

@Service javna klasa MyUserDetailsService implementira UserDetailsService {@Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername (String username) {User user = userRepository.findByUsername (username); if (user == null) {baciti novo UsernameNotFoundException (korisničko ime); } vratiti novog MyUserPrincipal (korisnik); }}

Definirajmo MyUserPrincipal razred kako slijedi:

javna klasa MyUserPrincipal implementira UserDetails {privatni korisnik; javni MyUserPrincipal (Korisnik korisnik) {this.user = korisnik; } // ...}

6. Proljetna konfiguracija

Pokazat ćemo obje vrste Spring konfiguracija: XML i temeljenu na napomenama, koje su potrebne kako bismo mogli koristiti našu prilagođenu UserDetailsService provedba.

6.1. Konfiguracija bilješki

Sve što trebamo učiniti da omogućimo naš običaj UserDetailsService je dodati ga u naš kontekst aplikacije kao grah.

Budući da smo našu klasu konfigurirali s @Servis napomena, aplikacija će je automatski otkriti tijekom skeniranja komponenata i stvorit će grah iz ove klase. Stoga ovdje ne trebamo ništa drugo raditi.

Alternativno, možemo:

  • konfigurirati u authenticationManager koristiti AuthenticationManagerBuilder # userDetailsService metoda
  • postavi ga kao svojstvo u običaju authenticationProvider grah, a zatim ga ubrizgajte pomoću AuthenticationManagerBuilder # authenticationProvider funkcija

6.2. XML konfiguracija

S druge strane, za XML konfiguraciju moramo definirati grah s tipom MyUserDetailsService, i ubrizgajte ga u Spring davatelj autentičnosti grah:

7. Ostale mogućnosti provjere autentičnosti podržane bazom podataka

The AuthenticationManagerBuilder nudi još jednu metodu za konfiguriranje autentifikacije temeljene na JDBC u našoj aplikaciji.

Morat ćemo konfigurirati AuthenticationManagerBuilder.jdbcAuthentication s Izvor podataka primjer. Ako naša baza podataka slijedi shemu proljetnih korisnika, tada će nam zadane konfiguracije dobro odgovarati.

Osnovnu konfiguraciju koja koristi ovaj pristup vidjeli smo u prethodnom postu.

The JdbcUserDetailsManager entitet koji proizlazi iz ove konfiguracije provodi UserDetailsService isto.

Kao rezultat, možemo zaključiti da je ovu konfiguraciju lakše implementirati, pogotovo ako koristimo Spring Boot koji automatski konfigurira Izvor podataka za nas.

Ako nam je, u svakom slučaju, potrebna viša razina fleksibilnosti, prilagođavajući točno način na koji će aplikacija dohvatiti korisničke detalje, tada ćemo se odlučiti za pristup koji smo slijedili u ovom vodiču.

8. Zaključak

Da rezimiramo, u ovom smo članku pokazali kako stvoriti prilagođenu proljetnu tehnologiju UserDetailsService potkrijepljeni trajnim podacima.

Implementaciju možete pronaći u projektu GitHub - ovo je projekt zasnovan na Mavenu, pa bi ga trebalo biti lako uvesti i pokrenuti kakav jest.


$config[zx-auto] not found$config[zx-overlay] not found