Holen Sie sich das UserDetails-Objekt aus dem Sicherheitskontext im Spring MVC-Controller

Lesezeit: 3 Minuten

Benutzer-Avatar
danny.lesnik

Ich verwende Spring Security 3 und Spring MVC 3.05.

Ich möchte den Benutzernamen des aktuell angemeldeten Benutzers ausdrucken, wie kann ich Benutzerdetails in meinem Controller abrufen?

@RequestMapping(value="/index.html", method=RequestMethod.GET)
    public ModelAndView indexView(){
         UserDetails user = ?
                mv.addObject("username", user.getUsername());
        ModelAndView mv = new ModelAndView("index");
        return mv;
    }   

Benutzer-Avatar
Quelledelica

Wenn Sie bereits sicher wissen, dass der Benutzer angemeldet ist (in Ihrem Beispiel if /index.html ist geschützt):

UserDetails userDetails =
 (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal();

Um zuerst zu überprüfen, ob der Benutzer angemeldet ist, überprüfen Sie, ob die aktuelle Authentication ist kein AnonymousAuthenticationToken.

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (!(auth instanceof AnonymousAuthenticationToken)) {
        // userDetails = auth.getPrincipal()
}

  • 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


Benutzer-Avatar
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

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

Notiz “HttpServletRequest-Anfrage” Parameter hinzugefügt.

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

Benutzer-Avatar
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.

1129020cookie-checkHolen Sie sich das UserDetails-Objekt aus dem Sicherheitskontext im Spring MVC-Controller

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy