如何找到Spring Boot中当前登录的用户?

在这个Spring Boot应用程序中有一个Web服务,它为登录用户返回一些数据:

@RequestMapping("/resource") public Map home() { Map model = new HashMap(); model.put("id", UUID.randomUUID().toString()); model.put("content", "Hello World"); return model; } 

想象一下,该方法的返回值取决于当前登录的用户。

如何找出该方法中登录的用户?

按要求:

在内部使用Spring Security的 Spring Boot提供了一个SecurityContextHolder类,它允许通过以下方式查找当前经过身份validation的用户:

 Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 

身份validation实例现在提供以下方法:

  • 获取登录用户的用户名: getPrincipal()
  • 获取经过身份validation的用户的密码: getCredentials()
  • 获取经过身份validation的用户的已分配角色: getAuthorities()
  • 获取经过身份validation的用户的更多详细信息: getDetails()

您也可以简单地使用HttpServletRequest获取用户原则,

使用HttpServletRequest请求,

 String user=request.getUserPrincipal().getName(); 

一种方法是将java.security.Principal添加为参数,如下所示:

 @RequestMapping("/resource") public Map home(Principal principal) { Map model = new HashMap(); model.put("id", UUID.randomUUID().toString()); model.put("content", "Hello " + principal.getName()); return model; } 

从Spring Security 4.0开始,您可以通过在控制器方法中添加一个参数来获取当前登录用户(您的UserDetails的实现):

 @RequestMapping("/resource") public Map home(@AuthenticationPrincipal User user) { .. } 

User替换为实现UserDetails接口的类的名称。

最近使用Keycloak身份validation服务器并访问当前登录的用户数据可以像这样访问

 String userID; KeycloakPrincipal kcPrincipal = getPrincipal(); KeycloakSecurityContext ksContext = kcPrincipal.getKeycloakSecurityContext(); IDToken idToken = ksContext.getToken(); userID = idToken.getName(); 

我使用带有OAuth的spring boot 2.0,所以我就是这样做的

 Authentication auth = SecurityContextHolder.getContext().getAuthentication(); Object pricipal = auth.getPrincipal(); String user=""; if (pricipal instanceof DefaultOidcUser) { user = ((DefaultOidcUser) pricipal).getName(); }