从Spring MVC控制器中的Security Context获取UserDetails对象

时间:2011-05-28 13:41:32

标签: java spring spring-mvc spring-security

我正在使用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;
    }   

6 个答案:

答案 0 :(得分:112)

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

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

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

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

答案 1 :(得分:31)

让Spring 3注射解决这个问题。

感谢tsunade21,最简单的方法是:

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

 }

答案 2 :(得分:4)

如果您只想在页面上打印用户名,也许您会喜欢这个解决方案。它没有对象转换,也没有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方法来检索用户信息。

答案 3 :(得分:1)

如果您使用的是spring security,那么您可以通过

获取当前登录的用户
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
     String name = auth.getName(); //get logged in username

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

您可以使用以下代码找出主体(登录的用户电子邮件)

@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.test.companydomain","com.test.domain"})
@EntityScan(basePackages = {"com.test.companydomain", "com.test.companydomain.assetManager","com.test.domain"})
@EnableJpaRepositories
class Application {

}

此代码是在SAML之上编写的。