Implementere en egendefinert UserDetailsService
Opprett en egendefinert `UserDetailsService` for å laste inn brukerspesifikke data fra applikasjonens datalager til bruk ved autentisering.
Implementere en egendefinert UserDetailsService er en gratis leksjon i Spring Security 6 og JWT-autentisering på CoddyKit. Dette er leksjon 1 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Spring Security 6 og JWT-autentisering, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Spring Security 6 og JWT-autentisering inneholder totalt 4 leksjoner.
Utover brukere i minnet
I tidligere leksjoner har De kanskje brukt brukere i minnet til enkel autentisering. Det betyr at brukernavn og passord er hardkodet direkte i applikasjonens konfigurasjon.
Selv om dette er praktisk for testing, må applikasjoner i den virkelige verden hente brukerdata fra en persistent kilde, for eksempel en database, LDAP eller en annen tjeneste. Det er her en egendefinert UserDetailsService kommer inn!
Grensesnittet UserDetailsService
Spring Security bruker grensesnittet UserDetailsService til å hente brukerspesifikke data under autentisering. Det har bare én metode De må implementere:
UserDetails loadUserByUsername(String username)
Denne metoden er avgjørende. Når en bruker forsøker å logge inn, kaller Spring Security denne metoden og sender med brukernavnet brukeren oppga.
Hva er UserDetails?
Metoden loadUserByUsername må returnere et UserDetails-objekt. Dette grensesnittet representerer informasjonen om den autentiserte brukeren, blant annet:
- Brukernavn
- Passord
- Autoriteter (roller/tillatelser)
- Kontostatus (for eksempel aktivert, låst eller utløpt)
Spring Security tilbyr en standardimplementasjon kalt org.springframework.security.core.userdetails.User som De ofte vil bruke.
Opprette Deres egen tjeneste
For å opprette en egendefinert brukertjeneste lager De ganske enkelt en klasse som implementerer UserDetailsService. Der overstyrer De metoden loadUserByUsername.
Det er i denne metoden De skriver logikken for å hente brukerdata fra det valgte datalageret. Foreløpig bruker vi noen hardkodede eksempler.
Implementere loadUserByUsername
Inne i loadUserByUsername utfører De disse trinnene:
- Motta
username. - Slå opp brukeren i datakilden.
- Hvis brukeren finnes, opprett et
UserDetails-objekt med opplysningene (brukernavn, passord og roller). - Hvis brukeren ikke finnes, kast et
UsernameNotFoundException.
Husk at passordkoding er avgjørende for sikkerheten, men dette tar vi opp i en senere leksjon. Foreløpig bruker vi et passord i klartekst med prefikset: {noop}.
Kode: Grunnleggende UserDetailsService
La oss se på en enkel implementasjon. Dette eksemplet hardkoder brukere og simulerer henting fra en datakilde. Kjør det for å se hvordan det fungerer!
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import java.util.Arrays;
import java.util.Collections;
class MyUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// In a real app, you'd fetch user from a database
if ("user".equals(username)) {
return User.withUsername("user")
.password("{noop}password") // {noop} for plain text
.roles("USER")
.build();
}
if ("admin".equals(username)) {
return User.withUsername("admin")
.password("{noop}adminpass")
.roles("ADMIN", "USER")
.build();
}
throw new UsernameNotFoundException("User not found: " + username);
}
}
public class Main {
public static void main(String[] args) {
MyUserDetailsService service = new MyUserDetailsService();
System.out.println("Attempting to load 'user'...");
try {
UserDetails user = service.loadUserByUsername("user");
System.out.println("Loaded User: " + user.getUsername());
System.out.println("Authorities: " + user.getAuthorities());
} catch (UsernameNotFoundException e) {
System.out.println(e.getMessage());
}
System.out.println("\nAttempting to load 'admin'...");
try {
UserDetails admin = service.loadUserByUsername("admin");
System.out.println("Loaded Admin: " + admin.getUsername());
System.out.println("Authorities: " + admin.getAuthorities());
} catch (UsernameNotFoundException e) {
System.out.println(e.getMessage());
}
System.out.println("\nAttempting to load 'unknown'...");
try {
service.loadUserByUsername("unknown");
} catch (UsernameNotFoundException e) {
System.out.println(e.getMessage());
}
}
}Legge til roller og autoriteter
Legg merke til at vi i eksemplet brukte .roles("USER") og .roles("ADMIN", "USER").
- Roller er overordnede tillatelser, som «ADMIN» eller «USER».
- Spring Security konverterer disse rollene til GrantedAuthority-objekter.
- Når De bygger
UserDetails-objektet, angir De hvilke roller/autoriteteter brukeren har.
Spring Security bruker senere disse autoritetene til autorisasjon (for å avgjøre hva en bruker har tilgang til).
Registrere tjenesten Deres
Når De har opprettet en egendefinert UserDetailsService, må Spring Security få vite om den. I en Spring Boot-applikasjon registrerer De den vanligvis som en Spring-bønne.
Ved ganske enkelt å definere den egendefinerte tjenesten som en @Bean vil Spring Securitys autokonfigurasjon vanligvis finne den og bruke den til autentisering.
Den egendefinerte autentiseringsflyten
Slik fungerer egendefinert autentisering vanligvis med tjenesten Deres:
- Brukeren sender inn innloggingsopplysninger (brukernavn og passord).
- Spring Security mottar forespørselen.
- Den kaller den egendefinerte
UserDetailsService-tjenestens metodeloadUserByUsername()med det oppgitte brukernavnet. - Metoden Deres henter brukerdata og returnerer et
UserDetails-objekt. - Spring Security sammenligner deretter passordet som ble oppgitt, med passordet fra
UserDetails(etter koding/avkoding). - Hvis de samsvarer, er autentiseringen vellykket!
Test forståelsen Deres
Vurder hovedformålet med og komponentene i implementasjonen av en egendefinert UserDetailsService.
Oppsummering: Egendefinert UserDetailsService
De har lært å implementere en egendefinert UserDetailsService, en grunnleggende komponent for avansert brukerautentisering i Spring Security:
- Den gjør det mulig å laste inn brukerdata fra en hvilken som helst kilde.
- De implementerer metoden
loadUserByUsername. - Denne metoden returnerer et
UserDetails-objekt som inneholder brukerens legitimasjon og autoriteter. - Den er nødvendig for å gå videre fra brukeradministrasjon i minnet.
Deretter skal vi se nærmere på hvordan passord sikres med riktig koding!
Lær deg Java med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 12
- Leksjoner
- 48
Ofte stilte spørsmål
Er leksjonen «Implementere en egendefinert UserDetailsService» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Spring Security 6 og JWT-autentisering, inkludert «Implementere en egendefinert UserDetailsService», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Spring Security 6 og JWT-autentisering inneholder totalt 4 leksjoner.
Hva lærer jeg i «Implementere en egendefinert UserDetailsService»?
Opprett en egendefinert `UserDetailsService` for å laste inn brukerspesifikke data fra applikasjonens datalager til bruk ved autentisering. Du øver på Spring Security 6 og JWT-autentisering med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Spring Security 6 og JWT-autentisering?
Ingen tidligere erfaring er nødvendig. Spring Security 6 og JWT-autentisering på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Implementere en egendefinert UserDetailsService»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Spring Security 6 og JWT-autentisering-leksjonen?
Ja. Alle Spring Security 6 og JWT-autentisering-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Implementere en egendefinert UserDetailsService
- Forstå passordkodere
- Integrasjon av brukerhåndtering med database
- Rollebasert autorisasjon med Granted Authorities