Spring Security 6 og JWT-autentisering · leksjon

Egendefinert OAuth2-success-handler

Utvikle en egendefinert success-handler som behandler brukerinformasjon etter en vellykket OAuth2-autentisering.

Leksjon 3 av 411 trinn

Egendefinert OAuth2-success-handler 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.

Introduksjon til OAuth2-innloggingsbehandlere

Velkommen til leksjonen om egendefinerte OAuth2-behandlere for vellykket innlogging! Når en bruker logger inn via en OAuth2-leverandør (som Google eller GitHub), må Spring Security vite hva som skal skje videre.

Som standard håndterer Spring Security en enkel omdirigering. Men hva om De må utføre egendefinerte handlinger, som å lagre brukerdetaljer eller oppdatere profilen? Det er her egendefinerte behandlere for vellykket innlogging kommer inn!

Standardflyt for OAuth2-innlogging

Når en bruker autentiseres mot en OAuth2-leverandør, er standardatferden til Spring Security ganske enkel:

  • Den henter brukerdetaljer (som navn og e-postadresse) fra leverandørens svar.
  • Den oppretter et OAuth2AuthenticationToken.
  • Den omdirigerer brukeren til applikasjonens rot-URL (eller en URL som brukeren tidligere forsøkte å åpne).

Dette er ofte tilstrekkelig for enkle integrasjoner, men applikasjoner i den virkelige verden trenger vanligvis mer.

Hvorfor tilpasse håndteringen av vellykket innlogging?

Ved å tilpasse behandleren for vellykket innlogging kan De:

  • Lagre brukerdata: Lagre nye brukere eller oppdatere eksisterende brukere i applikasjonens database.
  • Generere tokener: Opprette egendefinerte sesjonstokener eller JWT-er etter OAuth2-innlogging.
  • Omdirigere dynamisk: Sende brukere til forskjellige sider basert på rolle eller status.
  • Loggføre og revidere: Loggføre vellykkede innlogginger for sikkerhetsovervåking.

Dette gir Dem detaljert kontroll over prosessen etter autentiseringen.

AuthenticationSuccessHandler

Spring Security tilbyr grensesnittet AuthenticationSuccessHandler. De implementerer dette grensesnittet for å definere egendefinert logikk for hendelser der autentiseringen lykkes.

Kjernemetoden er onAuthenticationSuccess, som kalles etter at autentiseringen er godkjent.

public interface AuthenticationSuccessHandler {
void onAuthenticationSuccess(
HttpServletRequest request,
HttpServletResponse response,
Authentication authentication
) throws IOException, ServletException;
}

Opprette en enkel egendefinert behandler

La oss opprette en enkel egendefinert behandler som bare loggfører den vellykkede autentiseringen og deretter omdirigerer brukeren. Vi implementerer grensesnittet AuthenticationSuccessHandler.

import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.core.Authentication;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.stereotype.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Component
public class CustomOAuth2SuccessHandler implements AuthenticationSuccessHandler {

    private static final Logger logger = LoggerFactory.getLogger(CustomOAuth2SuccessHandler.class);

    @Override
    public void onAuthenticationSuccess(
        HttpServletRequest request,
        HttpServletResponse response,
        Authentication authentication) throws IOException, ServletException {

        logger.info("OAuth2 login successful for user: " + authentication.getName());
        // Default redirect to home page
        response.sendRedirect("/");
    }
}

Konfigurere den egendefinerte behandleren

For at Spring Security skal bruke den egendefinerte behandleren, må vi konfigurere den i SecurityFilterChain-bønnen. Vi bruker metoden oauth2Login().

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    private final AuthenticationSuccessHandler customOAuth2SuccessHandler;

    public SecurityConfig(AuthenticationSuccessHandler customOAuth2SuccessHandler) {
        this.customOAuth2SuccessHandler = customOAuth2SuccessHandler;
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .anyRequest().authenticated()
            )
            .oauth2Login(oauth2 -> oauth2
                .successHandler(customOAuth2SuccessHandler) // <--- Register our handler
            );
        return http.build();
    }
}

Tilgang til brukerdetaljer

Inne i onAuthenticationSuccess inneholder Authentication-objektet den autentiserte principalen. For OAuth2 vil denne principalen være en OAuth2User.

De kan konvertere den til OAuth2User for å få tilgang til leverandørspesifikke attributter som e-postadresse, navn eller unike ID-er (for eksempel Google-ID).

import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;

// Inside onAuthenticationSuccess method:

public void onAuthenticationSuccess(
    HttpServletRequest request,
    HttpServletResponse response,
    Authentication authentication) throws IOException, ServletException {

    if (authentication instanceof OAuth2AuthenticationToken) {
        OAuth2AuthenticationToken oauthToken = (OAuth2AuthenticationToken) authentication;
        OAuth2User oauth2User = oauthToken.getPrincipal();

        String email = oauth2User.getAttribute("email");
        String name = oauth2User.getAttribute("name");
        String provider = oauthToken.getAuthorizedClientRegistrationId();

        logger.info("User logged in: " + name + " from " + provider + " with email: " + email);
        // ... further processing
    }
    response.sendRedirect("/");
}

Praktisk: Lagre bruker i databasen

Et vanlig bruksområde er å lagre eller oppdatere brukerinformasjon i databasen etter en vellykket OAuth2-innlogging. Her er et forenklet eksempel:

import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.core.Authentication;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import org.springframework.stereotype.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

// Assume you have a UserService and User entity
// public interface UserService { User saveOrUpdateUser(OAuth2User oauth2User, String provider); }
// public class User { private String email; private String name; /*...*/ }

@Component
public class DatabaseOAuth2SuccessHandler implements AuthenticationSuccessHandler {

    private static final Logger logger = LoggerFactory.getLogger(DatabaseOAuth2SuccessHandler.class);
    // private final UserService userService; // Inject your user service

    // public DatabaseOAuth2SuccessHandler(UserService userService) {
    //     this.userService = userService;
    // }

    @Override
    public void onAuthenticationSuccess(
        HttpServletRequest request,
        HttpServletResponse response,
        Authentication authentication) throws IOException, ServletException {

        if (authentication instanceof OAuth2AuthenticationToken) {
            OAuth2AuthenticationToken oauthToken = (OAuth2AuthenticationToken) authentication;
            OAuth2User oauth2User = oauthToken.getPrincipal();
            String provider = oauthToken.getAuthorizedClientRegistrationId();

            logger.info("Processing OAuth2 user from " + provider);
            // User savedUser = userService.saveOrUpdateUser(oauth2User, provider);
            // logger.info("User saved/updated: " + savedUser.getEmail());
        }
        response.sendRedirect("/");
    }
}

Egendefinert omdirigeringslogikk

Metoden onAuthenticationSuccess lar Dem også styre omdirigeringen etter innlogging. De kan omdirigere brukere til et bestemt kontrollpanel, en side for profiloppsett eller tilbake til siden de forsøkte å åpne.

De kan bruke response.sendRedirect("/some-path") eller integrere med Springs RedirectStrategy.

  • request.getRequestURI(): Henter den opprinnelige forespørsels-URI-en.
  • response.sendRedirect("/"): Omdirigerer til roten.
  • new DefaultRedirectStrategy().sendRedirect(request, response, "/dashboard"): En mer robust omdirigering.

Rask kontroll: Behandlere for vellykket innlogging

Hvilke av følgende er gyldige grunner til å implementere en egendefinert AuthenticationSuccessHandler for OAuth2 i Spring Security?

Oppsummering: Egendefinerte behandlere for vellykket innlogging

I denne leksjonen har vi sett på hvordan prosessen etter autentisering kan tilpasses for OAuth2-innlogginger ved hjelp av Spring Securitys AuthenticationSuccessHandler.

  • Vi har lært formålet: å utvide standardatferden for brukerhåndtering, omdirigering og revisjon.
  • Vi har sett hvordan metoden onAuthenticationSuccess implementeres.
  • Vi har konfigurert den egendefinerte behandleren i SecurityFilterChain.
  • Vi har forstått hvordan detaljer fra OAuth2User hentes, og hvordan handlinger som å lagre brukere i en database utføres.

Egendefinerte behandlere for vellykket innlogging gir kraftig kontroll over applikasjonens brukeropplevelse og dataintegrasjon etter en OAuth2-innlogging.

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 «Egendefinert OAuth2-success-handler» gratis?

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

Utvikle en egendefinert success-handler som behandler brukerinformasjon etter en vellykket OAuth2-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 3 av 4.

Hvor lang tid tar leksjonen «Egendefinert OAuth2-success-handler»?

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. Oppsett av OAuth2-klient
  2. Integrasjon av sosial innlogging
  3. Egendefinert OAuth2-success-handler
  4. Tilgang til den autentiserte OAuth2-brukeren
← Tilbake til Spring Security 6 og JWT-autentisering