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

2022-08-31 11:47:39

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

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

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

我如何知道哪个用户是用该方法登录的?


答案 1

根据要求:

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

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

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

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

答案 2

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

import org.springframework.security.web.bind.annotation.AuthenticationPrincipal;

@RequestMapping("/resource")
public Map<String, Object> home(@AuthenticationPrincipal User user) {
   ..
}

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

编辑

由于Spring Security 4.0注释已移至其他软件包:

import org.springframework.security.core.annotation.AuthenticationPrincipal;

附录

这即使在反应式环境中也有效,而由于范式从每个请求模型的线程到每个线程的多个请求的范式转变,这将不起作用。WebFluxSecurityContextHolder.getContext().getAuthentication()


推荐