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.
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.
Spring Security - Setzen Sie Ihr Passwort zurück
Jede App sollte es Benutzern ermöglichen, ihr eigenes Passwort zu ändern, falls sie es vergessen.
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