Spring Security: Godkendelse med en databasestøttet UserDetailsService

1. Oversigt

I denne artikel viser vi, hvordan du opretter en brugerdefineret databasestøttet UserDetailsService til godkendelse med Spring Security.

2. UserDetailsService

Det UserDetailsService interface bruges til at hente brugerrelaterede data. Det har en metode, der hedder loadUserByUsername () som kan tilsidesættes for at tilpasse processen med at finde brugeren.

Det bruges af DaoAuthenticationProvider for at indlæse detaljer om brugeren under godkendelse.

3. Den Bruger Model

Til opbevaring af brugere opretter vi en Bruger enhed, der er kortlagt til en databasetabel med følgende attributter:

@Entity offentlig klasse bruger {@Id @GeneratedValue (strategi = GenerationType.AUTO) privat Lang id; @Column (nullable = false, unique = true) private String brugernavn; privat strengadgangskode; // standard getters og setter}

4. Hentning af en bruger

For at hente en bruger tilknyttet et brugernavn opretter vi en DAO klasse ved hjælp af Forårsdata ved at udvide JpaRepository grænseflade:

offentlig grænseflade UserRepository udvider JpaRepository {User findByUsername (String username); }

5. Den UserDetailsService

For at kunne levere vores egen brugertjeneste skal vi implementere UserDetailsService interface.

Vi opretter en klasse kaldet MyUserDetailsService der tilsidesætter metoden loadUserByUsername () af grænsefladen.

I denne metode henter vi Bruger objekt ved hjælp af DAO, og hvis den findes, skal du pakke den ind i en MyUserPrincipal objekt, der implementeres UserDetailsog returnerer det:

@Service offentlig klasse MyUserDetailsService implementerer UserDetailsService {@Autowired privat UserRepository userRepository; @ Override offentlige UserDetails loadUserByUsername (String username) {User user = userRepository.findByUsername (username); if (user == null) {throw new UsernameNotFoundException (username); } returner ny MyUserPrincipal (bruger); }}

Lad os definere MyUserPrincipal klasse som følger:

offentlig klasse MyUserPrincipal implementerer UserDetails {privat brugerbruger; offentlig MyUserPrincipal (brugerbruger) {this.user = bruger; } // ...}

6. Forårskonfiguration

Vi vil demonstrere begge typer forårskonfigurationer: XML og annoteringsbaseret, som er nødvendige for at bruge vores brugerdefinerede UserDetailsService implementering.

6.1. Kommentar konfiguration

Alt hvad vi skal gøre for at aktivere vores brugerdefinerede UserDetailsService er at føje det til vores applikationskontekst som en bønne.

Da vi konfigurerede vores klasse med @Service kommentar, applikationen registrerer det automatisk under komponentscanning, og det opretter en bønne fra denne klasse. Derfor er der ikke noget andet, vi skal gøre her.

Alternativt kan vi:

  • konfigurer det i authenticationManager bruger AuthenticationManagerBuilder # userDetailsService metode
  • sæt det som en egenskab i en brugerdefineret authenticationProvider bønne, og indsprøjt derefter den med AuthenticationManagerBuilder # authenticationProvider fungere

6.2. XML-konfiguration

På den anden side skal vi definere en bønne med typen til XML-konfigurationen MyUserDetailsServiceog indsprøjt det i forårets godkendelsesudbyder bønne:

7. Andre databasestøttede godkendelsesindstillinger

Det AuthenticationManagerBuilder tilbyder en anden metode til at konfigurere JDBC-baseret godkendelse i vores applikation.

Vi bliver nødt til at konfigurere AuthenticationManagerBuilder.jdbcAuthentication med en Datakilde eksempel. Hvis vores database følger Spring User Schema, passer standardkonfigurationerne os godt.

Vi har set en grundlæggende konfiguration ved hjælp af denne tilgang i et tidligere indlæg.

Det JdbcUserDetailsManager enhed, der er resultatet af denne konfiguration, implementerer UserDetailsService også.

Som et resultat kan vi konkludere, at denne konfiguration er lettere at implementere, især hvis vi bruger Spring Boot, der automatisk konfigurerer Datakilde for os.

Hvis vi alligevel har brug for et højere niveau af fleksibilitet, der tilpasser nøjagtigt, hvordan applikationen henter brugeroplysningerne, vælger vi den tilgang, vi fulgte i denne vejledning.

8. Konklusion

For at opsummere har vi i denne artikel vist, hvordan man opretter en brugerdefineret forårsbaseret UserDetailsService bakkes op af vedvarende data.

Implementeringen kan findes i GitHub-projektet - dette er et Maven-baseret projekt, så det skal være let at importere og køre som det er.