Spring Security - Benutzer mit automatischer Anmeldung nach der Registrierung

Spring Security - Benutzer mit automatischer Anmeldung nach Registrierung

1. Überblick

In diesem kurzen Tutorial wird erläutert, wie Benutzer unmittelbar nach dem Registrierungsprozess automatisch authentifiziert werden - in einer Spring Security-Implementierung.

Einfach ausgedrückt, sobald der Benutzer die Registrierung abgeschlossen hat, wird er normalerweise zur Anmeldeseite weitergeleitet und muss nun seinen Benutzernamen und sein Passwort erneut eingeben.

Lassen Sie uns sehen, wie wir dies vermeiden können, indem wir stattdessen den Benutzer automatisch authentifizieren.

Bevor wir beginnen, beachten Sie, dass wir im Bereich derregistration series hier auf der Website arbeiten.

2. Verwenden SieHttpServletRequest

Eine sehr einfache Möglichkeit, eine Authentifizierung programmgesteuert zu erzwingen, besteht darin, dieHttpServletRequest login()-Methode zu nutzen:

public void authWithHttpServletRequest(HttpServletRequest request, String username, String password) {
    try {
        request.login(username, password);
    } catch (ServletException e) {
        LOGGER.error("Error while login ", e);
    }
}

Nun, da unter der Haube dieHttpServletRequest.login() API dieAuthenticationManager verwendet, um die Authentifizierung durchzuführen.

Es ist auch wichtig, dieServletExceptionzu verstehen und damit umzugehen, die auf dieser Ebene auftreten können.

3. Verwenden SieAuthenticationManager

Als nächstes können wir auch direkt einUsernamePasswordAuthenticationToken erstellen - und dann die StandardAuthenticationManager manuell durchgehen:

public void authWithAuthManager(HttpServletRequest request, String username, String password) {
    UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(username, password);
    authToken.setDetails(new WebAuthenticationDetails(request));

    Authentication authentication = authenticationManager.authenticate(authToken);

    SecurityContextHolder.getContext().setAuthentication(authentication);
}

Beachten Sie, wie wir die Tokenanforderung erstellen, sie durch den Standardauthentifizierungsablauf leiten und dann das Ergebnis explizit im aktuellen Sicherheitskontext festlegen.

4. Komplexe Registrierung

In einigen komplexeren Szenarien besteht der Registrierungsprozess aus mehreren Schritten, z. B. einem Bestätigungsschritt, bis sich der Benutzer beim System anmelden kann.

In solchen Fällen ist es natürlich wichtig, genau zu verstehen, wo wir den Benutzer automatisch authentifizieren können. Das können wir nicht sofort nach der Registrierung tun, da das neu erstellte Konto zu diesem Zeitpunkt noch deaktiviert ist.

Einfach ausgedrückt -we have to perform the automatic authentication after they confirm their account.

Denken Sie auch daran, dass wir zu diesem Zeitpunkt keinen Zugriff mehr auf ihre tatsächlichen, unformatierten Anmeldeinformationen haben. Wir haben nur Zugriff auf das verschlüsselte Passwort des Benutzers - und das verwenden wir hier:

public void authWithoutPassword(User user){
    List privileges = user.getRoles().stream()
      .map(role -> role.getPrivileges())
      .flatMap(list -> list.stream())
      .distinct().collect(Collectors.toList());
    List authorities = privileges.stream()
        .map(p -> new SimpleGrantedAuthority(p.getName()))
        .collect(Collectors.toList());

    Authentication authentication = new UsernamePasswordAuthenticationToken(user, null, authorities);
    SecurityContextHolder.getContext().setAuthentication(authentication);
}

Beachten Sie, wie wir die Authentifizierungsberechtigungen hier richtig einstellen, wie dies normalerweise inAuthenticationProvider. der Fall ist

5. Fazit

Wir haben verschiedene Möglichkeiten zur automatischen Authentifizierung von Benutzern nach dem Registrierungsprozess erörtert.

Wie immer ist der vollständige Quellcodeover on GitHub verfügbar.