Получить объект 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;
}
Ответы
Ответ 1
Если вы уже точно знаете, что пользователь вошел в систему (в вашем примере, если /index.html
защищен):
UserDetails userDetails =
(UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Чтобы сначала проверить, вошел ли пользователь в систему, убедитесь, что текущий Authentication
не является AnonymousAuthenticationToken
.
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (!(auth instanceof AnonymousAuthenticationToken)) {
// userDetails = auth.getPrincipal()
}
Ответ 2
Пусть инъекция Spring 3 позаботится об этом.
Благодаря tsunade21 самый простой способ:
@RequestMapping(method = RequestMethod.GET)
public ModelAndView anyMethodNameGoesHere(Principal principal) {
final String loggedInUserName = principal.getName();
}
Ответ 3
Если вы просто хотите напечатать имя пользователя на страницах, возможно, вам понравится это решение. Он свободен от отливок объектов и работает без Spring Безопасность тоже:
@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 запрос.
Работает нормально, потому что Spring вводит собственные объекты (обертки) для HttpServletRequest, Principal и т.д., поэтому вы можете использовать стандартные java-методы для извлечения информации о пользователе.
Ответ 4
если вы используете защиту spring, тогда вы можете получить текущего зарегистрированного пользователя
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String name = auth.getName(); //get logged in username
Ответ 5
Это другое решение (Spring Безопасность 3):
public String getLoggedUser() throws Exception {
String name = SecurityContextHolder.getContext().getAuthentication().getName();
return (!name.equals("anonymousUser")) ? name : null;
}