Получить объект UserDetails из контекста безопасности в контроллере Spring MVC - PullRequest
65 голосов
/ 28 мая 2011

Я использую 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 ]

113 голосов
/ 28 мая 2011

Если вы уже точно знаете, что пользователь вошел в систему (в вашем примере, если /index.html защищен):

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

Чтобы сначала проверить, вошел ли пользователь в систему, убедитесь, что текущий Authentication не является AnonymousAuthenticationToken.

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (!(auth instanceof AnonymousAuthenticationToken)) {
        // userDetails = auth.getPrincipal()
}
31 голосов
/ 02 апреля 2014

Пусть Spring 3 позаботится об этом.

Благодаря tsunade21 самый простой способ:

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

 }
4 голосов
/ 25 июля 2012

Если вы просто хотите напечатать имя пользователя на страницах, возможно, вам понравится это решение.Он свободен от приведения объектов и работает без 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;
}

Примечание: добавлен параметр HttpServletRequest .

Работает нормально, потому что Spring внедряет свои собственные объекты (wrappers) для HttpServletRequest, Principal и т. д., поэтому вы можете использовать стандартные методы Java для получения информации о пользователе.

1 голос
/ 14 августа 2015

Это еще одно решение (Spring Security 3):

public String getLoggedUser() throws Exception {
    String name = SecurityContextHolder.getContext().getAuthentication().getName();
    return (!name.equals("anonymousUser")) ? name : null;
}
1 голос
/ 08 февраля 2013

если вы используете Spring Security, то вы можете получить текущего зарегистрированного пользователя, набрав

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
     String name = auth.getName(); //get logged in username
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...