在Spring MVC控制器中从安全上下文获取UserDetails对象

我正在使用Spring Security 3和Spring MVC 3.05。

我想打印当前login用户的用户名,我如何获取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; } 

如果您已经确定用户已经login(如果/index.html受保护,则在您的示例中):

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

要首先检查用户是否已login,请检查当前的Authentication是否不是AnonymousAuthenticationToken

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

让spring3注射照顾这个。

感谢tsunade21最简单的方法是:

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

如果你只是想在页面上打印用户名,也许你会喜欢这个解决scheme。 它没有对象铸件,也没有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注入HttpServletRequest,Principal等自己的对象(包装),所以你可以使用标准的Java方法来检索用户信息。

如果你正在使用spring安全,那么你可以通过获取当前login的用户

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

这是另一个解决scheme(Spring Security 3):

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