das gibt mir eine Ausnahme: java.lang.ClassCastException: java.lang.String cannot be cast to org.springframework.security.core.userdetails.UserDetails
– fresh_dev
26. Oktober 2011 um 16:45 Uhr
Ich verwende UsernamePasswordAuthenticationToken für meine Authentifizierung, und das gibt selbst für einen angemeldeten Benutzer einen String zurück. Das zurückgegebene Objekt kann je nach verwendetem Authentifizierungstyp variieren; Gießen Sie Ihre Klasse entsprechend, für mich ist es String.
– Erica Kane
18. Januar 2015 um 21:44 Uhr
Ich glaube, dass dies nicht die beste Methode ist, da SecurityContextHolder ThreadLocal darunter verwendet (siehe diese Frage stackoverflow.com/questions/609826/… ). Sofern nicht jemand einen tatsächlichen Benchmark für diese Methode bereitstellen könnte (weil es auch andere Strategien als einfache ThreadLocal gibt, aber ich sie nicht getestet habe), würde ich empfehlen, stattdessen die Antwort von Farm zu verwenden.
– Michael M
12. Februar 2015 um 16:26 Uhr
Wenn der Prinzipal String ist, können Sie SecurityContextHolder.getContext().getAuthentication().getDetails() verwenden. Es funktioniert zumindest für Spring Security Saml auf diese Weise.
– csviri
6. April 2017 um 12:58 Uhr
Bauernhof
Lassen Sie dies von Spring 3 Injection erledigen.
Dank tsunade21 ist der einfachste Weg:
@RequestMapping(method = RequestMethod.GET)
public ModelAndView anyMethodNameGoesHere(Principal principal) {
final String loggedInUserName = principal.getName();
}
Toll. Macht das Testen viel einfacher als bei der Verwendung statischer Methoden für SecurityContextHolder.
– Planky
15. Juli 2016 um 20:41 Uhr
L’sync
Wenn Sie nur den Benutzernamen auf die Seiten drucken möchten, wird Ihnen diese Lösung vielleicht gefallen. Es ist frei von Objekt-Castings und funktioniert auch ohne Spring Security:
@RequestMapping(value = "/index.html", method = RequestMethod.GET)
public ModelAndView indexView(HttpServletRequest request) {
ModelAndView mv = new ModelAndView("index");
String userName = "not logged in"; // Any default user name
Principal principal = request.getUserPrincipal();
if (principal != null) {
userName = principal.getName();
}
mv.addObject("username", userName);
// By adding a little code (same way) you can check if user has any
// roles you need, for example:
boolean fAdmin = request.isUserInRole("ROLE_ADMIN");
mv.addObject("isAdmin", fAdmin);
return mv;
}
Funktioniert gut, da Spring seine eigenen Objekte (Wrapper) für HttpServletRequest, Principal usw. einfügt, sodass Sie Standard-Java-Methoden verwenden können, um Benutzerinformationen abzurufen.
Das ist eine andere Lösung (Spring Security 3):
public String getLoggedUser() throws Exception {
String name = SecurityContextHolder.getContext().getAuthentication().getName();
return (!name.equals("anonymousUser")) ? name : null;
}
zustimmen
Wenn Sie Spring Security verwenden, können Sie den aktuell angemeldeten Benutzer abrufen
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String name = auth.getName(); //get logged in username
Sie können den folgenden Code verwenden, um den Auftraggeber herauszufinden (Benutzer-E-Mail, die sich angemeldet hat).
org.opensaml.saml2.core.impl.NameIDImpl principal =
(NameIDImpl) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
String email = principal.getValue();
Dieser Code wird auf SAML geschrieben.
11290200cookie-checkHolen Sie sich das UserDetails-Objekt aus dem Sicherheitskontext im Spring MVC-Controlleryes