Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 如何在Spring云微服务中获取当前登录用户?_Spring Boot_Spring Cloud_Netflix Zuul - Fatal编程技术网

Spring boot 如何在Spring云微服务中获取当前登录用户?

Spring boot 如何在Spring云微服务中获取当前登录用户?,spring-boot,spring-cloud,netflix-zuul,Spring Boot,Spring Cloud,Netflix Zuul,我有一个springcloud应用程序,带有Gateway微服务,由Zuul供电Gateway主要职责是使用Spring-Security和JWT对用户进行身份验证和授权。 现在,在网关后面的其他微服务中,我想获得当前登录的用户。有什么想法吗?我实现了一个类似的体系结构。我是通过下面的方法实现的 步骤1-通过在应用程序属性中配置敏感头,将Zuul配置为将头传递给下游系统 zuul.sensitiveHeaders=Cookie,Set-Cookie 步骤2-在网关中公开一个端点,该端点返回当前

我有一个
springcloud
应用程序,带有
Gateway
微服务,由
Zuul
供电
Gateway
主要职责是使用
Spring-Security
JWT
对用户进行身份验证和授权。
现在,在
网关
后面的其他微服务中,我想获得当前登录的用户。有什么想法吗?

我实现了一个类似的体系结构。我是通过下面的方法实现的

步骤1-通过在应用程序属性中配置敏感头,将Zuul配置为将头传递给下游系统

zuul.sensitiveHeaders=Cookie,Set-Cookie
步骤2-在网关中公开一个端点,该端点返回当前登录的用户详细信息

public UserReturnData fetchUserDetails() 
    {
        UserReturnData userReturnData = new UserReturnData();
        List<String> roles = new ArrayList<String>();

        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        userReturnData.setUsername(auth.getName());
        Long id=uRepo.findId(auth.getName());
        userReturnData.setId(id);
        Collection<SimpleGrantedAuthority> authorities = (Collection<SimpleGrantedAuthority>) SecurityContextHolder
                .getContext().getAuthentication().getAuthorities();
        for (SimpleGrantedAuthority authority : authorities) {
            roles.add(authority.getAuthority());
        }
        userReturnData.setRoles(roles);
        return userReturnData;
    }

这是如果你想保持简单。如果您有更复杂的需求,可以使用zuul过滤器。

您可以在请求头中将其作为correlationid和其他文件发送
@Service
public class UserDetailsService 
{
    @Autowired
    WebClient.Builder webClientBuilder;
    
    @Autowired
    HttpServletRequest request;
    
    @Value("${common.serverurl}")
    private String reqUrl;
    
    public UserReturnData getCurrentUser()
    {
        UserReturnData userDetails = webClientBuilder.build()
                            .get()
                            .uri(reqUrl+"user/me")
                            .header("Authorization", request.getHeader("Authorization"))
                            .retrieve()
                            .bodyToMono(UserReturnData.class)
                            .block();
        return userDetails;
    }
}