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;
}
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()
}
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();
}
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.
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
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;
}