web-dev-qa-db-fra.com

Obtention de l'objet UserDetails à partir du contexte de sécurité dans le contrôleur Spring MVC

J'utilise Spring Security 3 et Spring MVC 3.05.

Je souhaite imprimer le nom d'utilisateur de l'utilisateur actuellement connecté, comment puis-je extraire UserDetails dans mon contrôleur?

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

Si vous savez déjà avec certitude que l'utilisateur est connecté (dans votre exemple, si /index.html est protégé):

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

Pour d'abord vérifier si l'utilisateur est connecté, vérifiez que le Authentication actuel n'est pas un AnonymousAuthenticationToken.

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

Laissez Spring 3 injection s’occuper de cela.

Grâce à tsunade21 , le plus simple est:

 @RequestMapping(method = RequestMethod.GET)   
 public ModelAndView anyMethodNameGoesHere(Principal principal) {
        final String loggedInUserName = principal.getName();

 }
31
Farm

Si vous souhaitez simplement imprimer le nom d'utilisateur sur les pages, vous aimerez peut-être cette solution. Il est exempt d'objectifs et fonctionne sans 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;
}

Remarque "Demande HttpServletRequest" ajouté.

Fonctionne bien car Spring injecte ses propres objets (wrappers) pour HttpServletRequest, Principal, etc., de sorte que vous puissiez utiliser les méthodes standard Java pour récupérer les informations de l'utilisateur.

4
L'sync

si vous utilisez la sécurité de printemps, vous pouvez obtenir l'utilisateur actuellement connecté en

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
     String name = auth.getName(); //get logged in username
1
amit

C'est une autre solution (Spring Security 3):

public String getLoggedUser() throws Exception {
    String name = SecurityContextHolder.getContext().getAuthentication().getName();
    return (!name.equals("anonymousUser")) ? name : null;
}
1
Alexey Nikitenko