在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; }