Vårsikkerhet: Autentisering med en databasestøttet UserDetailsService

1. Oversikt

I denne artikkelen vil vi vise hvordan du lager en egendefinert databasestøttet UserDetailsService for autentisering med Spring Security.

2. UserDetailsService

De UserDetailsService grensesnitt brukes til å hente brukerrelaterte data. Den har en metode som heter loadUserByUsername () som kan overstyres for å tilpasse prosessen med å finne brukeren.

Den brukes av DaoAuthenticationProvider for å laste inn detaljer om brukeren under autentisering.

3. Den Bruker Modell

For lagring av brukere lager vi en Bruker enhet som er kartlagt til en databasetabell, med følgende attributter:

@Entity offentlig klasse bruker {@Id @GeneratedValue (strategi = GenerationType.AUTO) privat Lang id; @Column (nullable = false, unique = true) private String brukernavn; privat strengpassord; // standard getters og setters}

4. Hente en bruker

For å hente en bruker tilknyttet et brukernavn, oppretter vi en DAO klasse bruker Vårdata ved å utvide JpaRepository grensesnitt:

offentlig grensesnitt UserRepository utvider JpaRepository {User findByUsername (String username); }

5. Den UserDetailsService

For å kunne tilby vår egen brukertjeneste, må vi implementere UserDetailsService grensesnitt.

Vi lager en klasse som heter MyUserDetailsService som overstyrer metoden loadUserByUsername () av grensesnittet.

I denne metoden henter vi Bruker objektet ved hjelp av DAO, og hvis den eksisterer, pakk den inn i en MyUserPrincipal objekt, som implementerer UserDetails, og returnerer den:

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

La oss definere MyUserPrincipal klasse som følger:

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

6. Vårkonfigurasjon

Vi vil demonstrere begge typer vårkonfigurasjoner: XML og kommentarbaserte, som er nødvendige for å kunne bruke vår skikk UserDetailsService gjennomføring.

6.1. Kommentar konfigurasjon

Alt vi trenger å gjøre for å aktivere vår skikk UserDetailsService er å legge det til vår applikasjonskontekst som en bønne.

Siden vi konfigurerte klassen vår med @Service kommentar, vil applikasjonen automatisk oppdage det under komponentskanning, og det vil lage en bønne fra denne klassen. Derfor er det ikke noe annet vi trenger å gjøre her.

Alternativt kan vi:

  • konfigurer den i authenticationManager bruker AuthenticationManagerBuilder # userDetailsService metode
  • angi det som en egenskap i en skikk authenticationProvider bønnen, og injiser deretter den med AuthenticationManagerBuilder # authenticationProvider funksjon

6.2. XML-konfigurasjon

På den annen side må vi definere en bønne med typen for XML-konfigurasjonen MyUserDetailsService, og injiser den i vårens autentiseringsleverandør bønne:

7. Andre databasestøttede autentiseringsalternativer

De AuthenticationManagerBuilder tilbyr en annen metode for å konfigurere JDBC-basert autentisering i applikasjonen vår.

Vi må konfigurere AuthenticationManagerBuilder.jdbcAuthentication med en Datakilde forekomst. Hvis databasen vår følger vårbrukerskjemaet, vil standardkonfigurasjonene passe oss godt.

Vi har sett en grunnleggende konfigurasjon ved hjelp av denne tilnærmingen i et tidligere innlegg.

De JdbcUserDetailsManager enhet som følge av denne konfigurasjonen implementerer UserDetailsService også.

Som et resultat kan vi konkludere med at denne konfigurasjonen er enklere å implementere, spesielt hvis vi bruker Spring Boot som automatisk konfigurerer Datakilde for oss.

Hvis vi uansett trenger et høyere fleksibilitetsnivå, og tilpasse nøyaktig hvordan applikasjonen skal hente brukerinformasjonen, så velger vi tilnærmingen vi fulgte i denne opplæringen.

8. Konklusjon

For å oppsummere, i denne artikkelen har vi vist hvordan du lager en tilpasset vårbasert UserDetailsService støttet av vedvarende data.

Implementeringen finner du i GitHub-prosjektet - dette er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.