Получить объект UserDetails из контекста безопасности в контроллере Spring MVC
Я использую Spring Security 3 и Spring MVC 3.05.
Я хотел бы напечатать имя пользователя текущего зарегистрированного пользователя, как я могу получить UserDetails в моем контроллере?
@RequestMapping(value="/index.html", method=RequestMethod.GET)
public ModelAndView indexView(){
UserDetails user = ?
mv.addObject("username", user.getUsername());
ModelAndView mv = new ModelAndView("index");
return mv;
}
5 ответов:
если вы уже точно знаете, что пользователь вошел в систему (в вашем примере, если
/index.html
защищенный):UserDetails userDetails = (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
чтобы сначала проверить, если пользователь вошел в систему, проверьте, что текущий
Authentication
- это неAnonymousAuthenticationToken
.Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (!(auth instanceof AnonymousAuthenticationToken)) { // userDetails = auth.getPrincipal() }
пусть весна 3 инъекции позаботиться об этом.
спасибо tsunade21 самый простой способ сделать это:
@RequestMapping(method = RequestMethod.GET) public ModelAndView anyMethodNameGoesHere(Principal principal) { final String loggedInUserName = principal.getName(); }
Если вы просто хотите напечатать имя пользователя на страницах, возможно, Вам понравится это решение. Он свободен от отливок объекта и работает без Безопасности весны тоже:
@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; }
Примечание "HttpServletRequest request параметр" добавил.
отлично работает, потому что Spring вводит свои собственные объекты (обертки) для HttpServletRequest, Principal и т. д., поэтому вы можете использовать стандартные методы java для получения информации о пользователе.