Spring Security 6 og JWT-autentisering · leksjon

Integrasjon av AuthenticationManager og Provider

Koble JWT-filteret til Spring Securitys `AuthenticationManager` og egendefinerte autentiseringsleverandører.

Leksjon 3 av 411 trinn

Integrasjon av AuthenticationManager og Provider er en gratis leksjon i Spring Security 6 og JWT-autentisering på CoddyKit. Dette er leksjon 3 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.

Orkestrere autentisering

Velkommen til kjernen i Spring Securitys autentiseringsprosess! I dag skal vi koble JWT-filteret vårt sammen med to viktige komponenter: AuthenticationManager og AuthenticationProvider.

Disse komponentene samarbeider om å bekrefte brukerens identitet og opprette brukerens sikkerhetskontekst.

Managerens hovedansvar

AuthenticationManager er det sentrale grensesnittet i Spring Security for håndtering av autentiseringsforespørsler. Tenk på det som dirigenten i et orkester.

  • Det mottar et Authentication-objekt (som representerer brukerens påloggingsinformasjon).
  • Det delegerer selve autentiseringsoppgaven til én eller flere AuthenticationProvider-instanser.
  • Hvis autentiseringen lykkes, returnerer det et fullstendig autentisert Authentication-objekt.

AuthenticationProviders rolle

Mens AuthenticationManager orkestrerer, er AuthenticationProvider-instanser de spesialiserte arbeiderne.

Hver provider vet hvordan en bestemt type bruker eller påloggingsinformasjon skal autentiseres (f.eks. brukernavn/passord, LDAP eller, i vårt tilfelle, en JWT). Den inneholder logikken som validerer påloggingsinformasjonen.

Opprette et JWT-tokenobjekt

I JWT-flyten vår trenger vi en måte å representere en uautentisert JWT på i Spring Security. Vi oppretter derfor en egendefinert implementasjon av Authentication, som ofte kalles JwtAuthenticationToken.

  • Før autentisering inneholder den den rå JWT-strengen.
  • Etter autentisering inneholder den den autentiserte brukerens detaljer (UserDetails) og autoriteter.

Bygge JWT-provideren vår

La oss nå opprette vår egen JwtAuthenticationProvider. Denne klassen skal implementere grensesnittet AuthenticationProvider.

Hovedoppgaven er å ta imot vår JwtAuthenticationToken, validere JWT-en, hente ut brukerdetaljer og returnere et fullt autentisert token.

Logikken i JwtAuthenticationProvider

Her er en forenklet oversikt over hva authenticate-metoden i JwtAuthenticationProvider kan gjøre. Den kontrollerer om tokenet er gyldig, og oppretter deretter et autentisert objekt.

import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.GrantedAuthority;
import java.util.Collections;

public class CustomJwtAuthProvider implements AuthenticationProvider {

  @Override
  public Authentication authenticate(Authentication authentication)
      throws AuthenticationException {
    // In a real app, you'd validate the JWT here.
    // For this example, we'll assume it's valid if it's our custom type.
    if (authentication instanceof JwtAuthenticationToken) {
      // Simulate successful JWT validation
      // Extract username and roles from the JWT payload
      String username = "coddykitUser"; // From JWT subject
      // Roles would also come from JWT claims
      // For simplicity, we grant a basic role
      GrantedAuthority role = () -> "ROLE_USER";
      User userDetails = new User(username, "", Collections.singletonList(role));

      // Return a fully authenticated token
      // The credentials (JWT string) are usually cleared
      return new JwtAuthenticationToken(userDetails, Collections.singletonList(role));
    }
    return null; // Not our type of authentication
  }

  @Override
  public boolean supports(Class<?> authentication) {
    // This provider supports our custom JwtAuthenticationToken
    return JwtAuthenticationToken.class.isAssignableFrom(authentication);
  }

  // Simple placeholder for our custom token
  static class JwtAuthenticationToken implements Authentication {
    private final User userDetails;
    private final String jwtToken;
    private boolean authenticated;
    private java.util.Collection<? extends GrantedAuthority> authorities;

    public JwtAuthenticationToken(String jwtToken) {
      this.jwtToken = jwtToken;
      this.userDetails = null;
      this.authenticated = false;
      this.authorities = Collections.emptyList();
    }

    public JwtAuthenticationToken(User userDetails,
                                  java.util.Collection<? extends GrantedAuthority> authorities) {
      this.userDetails = userDetails;
      this.jwtToken = null; // Token already validated
      this.authenticated = true;
      this.authorities = authorities;
    }

    @Override
    public java.util.Collection<? extends GrantedAuthority> getAuthorities() {
      return authorities;
    }

    @Override
    public Object getCredentials() {
      return jwtToken; // The raw JWT string (if unauthenticated)
    }

    @Override
    public Object getDetails() {
      return userDetails;
    }

    @Override
    public Object getPrincipal() {
      return userDetails; // The authenticated user object
    }

    @Override
    public boolean isAuthenticated() {
      return authenticated;
    }

    @Override
    public void setAuthenticated(boolean isAuthenticated)
        throws IllegalArgumentException {
      this.authenticated = isAuthenticated;
    }

    @Override
    public String getName() {
      return userDetails != null ? userDetails.getUsername() : "N/A";
    }
  }

  public static void main(String[] args) {
    System.out.println("CustomJwtAuthProvider initialized.");
    // In a real app, Spring Security would call authenticate()
    // We're just demonstrating the class structure here.
  }
}

Koble inn provideren

For at JwtAuthenticationProvider skal kunne brukes, må vi registrere den i konfigurasjonen av Spring Security. Dette gjøres vanligvis i sikkerhetskonfigurasjonsklassen.

Spring Boot konfigurerer ofte AuthenticationManager automatisk, men vi kan legge til egendefinerte providere.

Samspillet mellom filter og manager

Husk vårt egendefinerte JwtAuthenticationFilter fra forrige leksjon? Nå kobler vi det til AuthenticationManager.

  • Filteret henter ut JWT-en fra forespørselen.
  • Det oppretter en uautentisert JwtAuthenticationToken.
  • Deretter sender det dette tokenet til AuthenticationManager for behandling.

Manager-komponenten finner og bruker deretter vår JwtAuthenticationProvider.

JWT-autentiseringsflyten

La oss følge hele autentiseringsflyten med de nye komponentene våre:

  1. Klienten sender en forespørsel med JWT i Authorization-headeren.
  2. Vårt JwtAuthenticationFilter fanger opp forespørselen og henter ut JWT-en.
  3. Filteret oppretter en uautentisert JwtAuthenticationToken.
  4. Filteret kaller AuthenticationManager.authenticate() med dette tokenet.
  5. AuthenticationManager finner vår JwtAuthenticationProvider (fordi supports() returnerer true).
  6. JwtAuthenticationProvider validerer JWT-en og oppretter en fullt autentisert JwtAuthenticationToken (som inneholder UserDetails og autoriteter).
  7. Filteret mottar det autentiserte tokenet og legger det i SecurityContextHolder.
  8. Forespørselen fortsetter, og systemet vet nå hvem brukeren er og hva vedkommende kan gjøre!

Forstå flyten

Hvilke påstander beskriver rollene til AuthenticationManager og AuthenticationProvider korrekt i et Spring Security-oppsett med JWT?

Sett alt sammen

I denne leksjonen har vi sett på hvordan AuthenticationManager fungerer som den sentrale koordinatoren, og hvordan en egendefinert AuthenticationProvider håndterer den spesifikke logikken for validering av JWT-er.

Ved å integrere disse komponentene med JwtAuthenticationFilter har vi etablert en robust og modulær JWT-autentiseringsflyt i Spring Security. Denne separasjonen av ansvarsområder gjør sikkerhetskonfigurasjonen fleksibel og enklere å vedlikeholde!

Gratis å komme i gang

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 «Integrasjon av AuthenticationManager og Provider» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Spring Security 6 og JWT-autentisering, inkludert «Integrasjon av AuthenticationManager og Provider», 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 «Integrasjon av AuthenticationManager og Provider»?

Koble JWT-filteret til Spring Securitys `AuthenticationManager` og egendefinerte autentiseringsleverandører. 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 3 av 4.

Hvor lang tid tar leksjonen «Integrasjon av AuthenticationManager og Provider»?

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

  1. Utforme autentiseringsflyten for JWT
  2. Implementere et egendefinert JWT-filter
  3. Integrasjon av AuthenticationManager og Provider
  4. Håndtering av autentiseringsfeil og entry points
← Tilbake til Spring Security 6 og JWT-autentisering