如何找到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(); }