Benutzerinformationen in Spring Security abrufen

Abrufen von Benutzerinformationen in Spring Security

1. Überblick

Dieser Artikel zeigt, wie manretrieve the user details in Spring Security macht.

Der derzeit authentifizierte Benutzer ist im Frühjahr über eine Reihe verschiedener Mechanismen verfügbar. Lassen Sie uns zunächst die häufigste Lösung behandeln - den programmgesteuerten Zugriff.

Weitere Lektüre:

Behalten Sie den Überblick über angemeldete Benutzer mit Spring Security

Eine Kurzanleitung, um angemeldete Benutzer in einer mit Spring Security erstellten Anwendung zu verfolgen.

Read more

Spring Security - Rollen und Privilegien

So ordnen Sie Rollen und Berechtigungen für eine Spring Security-Anwendung zu: das Setup, die Authentifizierung und den Registrierungsprozess.

Read more

Spring Security - Setzen Sie Ihr Passwort zurück

Jede App sollte es Benutzern ermöglichen, ihr eigenes Passwort zu ändern, falls sie es vergessen.

Read more

2. Holen Sie sich den Benutzer in eine Bean

Der einfachste Weg, den aktuell authentifizierten Principal abzurufen, ist ein statischer Aufruf vonSecurityContextHolder:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String currentPrincipalName = authentication.getName();

Eine Verbesserung dieses Snippets besteht darin, zunächst zu überprüfen, ob ein authentifizierter Benutzer vorhanden ist, bevor versucht wird, darauf zuzugreifen:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (!(authentication instanceof AnonymousAuthenticationToken)) {
    String currentUserName = authentication.getName();
    return currentUserName;
}

Es gibt natürlich Nachteile eines solchen statischen Aufrufs - die verminderte Testbarkeit des Codes ist eine der offensichtlicheren. Stattdessen werden wir alternative Lösungen für diese sehr häufige Anforderung untersuchen.

3. Holen Sie sich den Benutzer in einen Controller

In einer mit@Controller kommentierten Bean gibt es zusätzliche Optionen. The principal can be defined directly as a method argument und es wird vom Framework korrekt aufgelöst:

@Controller
public class SecurityController {

    @RequestMapping(value = "/username", method = RequestMethod.GET)
    @ResponseBody
    public String currentUserName(Principal principal) {
        return principal.getName();
    }
}

Alternativwe can also use the authentication token:

@Controller
public class SecurityController {

    @RequestMapping(value = "/username", method = RequestMethod.GET)
    @ResponseBody
    public String currentUserName(Authentication authentication) {
        return authentication.getName();
    }
}

Die API der KlasseAuthenticationist sehr offen, damit das Framework so flexibel wie möglich bleibt. Aus diesem Grund istthe Spring Security principal can only be retrieved as an Object and needs to be cast to the correct UserDetails instance:

UserDetails userDetails = (UserDetails) authentication.getPrincipal();
System.out.println("User has authorities: " + userDetails.getAuthorities());

Und schließlich direktfrom the HTTP request:

@Controller
public class GetUserWithHTTPServletRequestController {

    @RequestMapping(value = "/username", method = RequestMethod.GET)
    @ResponseBody
    public String currentUserNameSimple(HttpServletRequest request) {
        Principal principal = request.getUserPrincipal();
        return principal.getName();
    }
}

4. Holen Sie sich den Benutzer über eine benutzerdefinierte Schnittstelle

Um die Spring-Abhängigkeitsinjektion voll auszunutzen und die Authentifizierung überall abrufen zu können, nicht nur in@Controller beans, müssen wir den statischen Zugriff hinter einer einfachen Fassade verbergen:

public interface IAuthenticationFacade {
    Authentication getAuthentication();
}
@Component
public class AuthenticationFacade implements IAuthenticationFacade {

    @Override
    public Authentication getAuthentication() {
        return SecurityContextHolder.getContext().getAuthentication();
    }
}

Die Fassade legt dasAuthentication-Objekt frei, während der statische Zustand ausgeblendet wird und der Code entkoppelt und vollständig testbar bleibt:

@Controller
public class GetUserWithCustomInterfaceController {
    @Autowired
    private IAuthenticationFacade authenticationFacade;

    @RequestMapping(value = "/username", method = RequestMethod.GET)
    @ResponseBody
    public String currentUserNameSimple() {
        Authentication authentication = authenticationFacade.getAuthentication();
        return authentication.getName();
    }
}

5. Holen Sie sich den Benutzer in JSP

Der aktuell authentifizierte Principalcan also be accessed in JSP pages durch Nutzung der Taglib-Unterstützung für Federsicherheit. Zuerst müssen wir das Tag auf der Seite definieren:

<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>

Als nächstes können wirrefer to the principal:


    authenticated as 

6. Holen Sie sich den Benutzer in Thymeleaf

Thymeleaf ist eine moderne serverseitige Web Templating Engine mit einem gutenintegration with the Spring MVCFramework. Lassen Sie uns auf einer Seite mit der Thymeleaf-Engine sehen, wie Sie auf den aktuell authentifizierten Principal zugreifen.

Zuerst müssen wir die Abhängigkeitenthymeleaf-spring5 undthymeleaf-extras-springsecurity5 hinzufügen, um Thymeleaf in Spring Security zu integrieren:


    org.thymeleaf.extras
    thymeleaf-extras-springsecurity5


    org.thymeleaf
    thymeleaf-spring5

Jetztwe can refer to the principal in the HTML page using the sec:authorize attribute:



    
Authenticated as

7. Fazit

In diesem Artikel wurde gezeigt, wie Benutzerinformationen in einer Spring-Anwendung abgerufen werden, beginnend mit dem allgemeinen statischen Zugriffsmechanismus, gefolgt von mehreren besseren Methoden zum Einfügen des Principals.

Die Implementierung dieser Beispiele finden Sie inthe GitHub project - dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein. Wenn das Projekt lokal ausgeführt wird, kann auf die HTML-Startseite zugegriffen werden unter:

http://localhost:8080/spring-security-rest-custom/foos/1