Abrufen von Benutzerinformationen in Spring Security

1. Übersicht

Dieser Artikel zeigt, wie Sie die Benutzerdetails in Spring Security abrufen .

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.

2. Holen Sie sich den Benutzer in eine Bean

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

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; }

Ein solcher statischer Aufruf hat natürlich auch Nachteile: Eine 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. Der Principal kann direkt als Methodenargument definiert werden und 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(); } }

Alternativ können wir auch das Authentifizierungstoken verwenden :

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

Die API der Authentifizierungsklasse ist sehr offen, damit das Framework so flexibel wie möglich bleibt. Aus diesem Grund kann der Spring Security-Principal nur als Objekt abgerufen werden und muss in die richtige UserDetails- Instanz umgewandelt werden:

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

Und schließlich direkt aus der HTTP-Anfrage :

@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 das Authentifizierungsobjekt frei , während der statische Status 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

Auf den aktuell authentifizierten Principal kann auch auf JSP-Seiten zugegriffen werden , indem die Unterstützung für die Spring Security Taglib genutzt wird. Zuerst müssen wir das Tag auf der Seite definieren:

Als nächstes können wir uns auf den Auftraggeber beziehen :

 authenticated as  

6. Holen Sie sich den Benutzer in Thymeleaf

Thymeleaf ist eine moderne serverseitige Web-Template-Engine mit guter Integration in das Spring MVC-Framework. Sehen wir uns an, wie Sie auf einer Seite mit der Thymeleaf-Engine auf den aktuell authentifizierten Principal zugreifen können.

Zuerst müssen wir die Abhängigkeiten Thymeleaf-Spring5 und Thymeleaf-Extras-Springsecurity5 hinzufügen, um Thymeleaf in Spring Security zu integrieren:

 org.thymeleaf.extras thymeleaf-extras-springsecurity5   org.thymeleaf thymeleaf-spring5 

Jetzt können wir auf das Prinzipal in der HTML-Seite mit dem Attribut sec: authorize verweisen :

 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 Möglichkeiten zum Injizieren des Principals.

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

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