Spring Boot 2 Microservices-将主体传播到服务

时间:2019-06-06 16:28:18

标签: spring-boot spring-cloud netflix-zuul

我正在开发一个使用Spring Boot,Spring Cloud和Zuul作为网关的应用程序。

我使用Spring Security创建了一个授权服务,该服务将在用户登录时生成JWT令牌。

Zuul网关可以解码此令牌,并将请求发送到我的应用程序中,传递给路由服务。

现在的问题是,我如何才能在一种微服务中获取登录用户(或令牌本身)?有没有办法告诉Zuul网关将令牌附加到他传递给路由路径的每个请求上?

所有微服务都没有将Spring Security作为依赖项,因为这种想法是仅在网关级别而不是在所有地方都检查令牌,但是我找不到合适的方法...

假设我在网关中路由了一个用户服务。登录后,用户要检查其个人资料。

他将使用令牌向{{gateway_url}}/getUser发出请求。

网关配置为

zuul:
  ignored-services: '*'
  sensitive-headers: Cookie,Set-Cookie
  routes:
    user-service:
      path: /user/**
      service-id: USER-SERVICE

网关会将此请求路由到USER-SERVICE应用程序和getProfile控制器方法,我如何知道哪个是登录用户?谁提出了请求?

2 个答案:

答案 0 :(得分:0)

敏感标头是黑名单,默认值不为空。因此,要使Zuul发送所有标头(被忽略的标头除外),必须将其显式设置为空列表。如果要将Cookie或授权标头传递到后端,则必须这样做。以下示例显示了如何使用sensitiveHeaders:

application.yml

 zuul:
  routes:
    users:
      path: /myusers/**
      sensitiveHeaders:
      url: https://downstream

答案 1 :(得分:0)

现在的问题是,我如何获得登录用户(或令牌) 本身)在微服务之一中?有没有办法告诉Zuul 将令牌附加到他传递给路由的每个请求的网关 路径?

您可以在zuul路由请求之前将任何自定义标头添加到请求中, 看一下这段代码:

@Configuration
public class ZuulCustomFilter extends ZuulFilter {

    private static final String ZULL_HEADER_USER_ID = "X-Zuul-UserId";

    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        return authentication != null && authentication.getPrincipal() != null;
    }

    @Override
    public Object run() throws ZuulException {
        if (
            SecurityContextHolder.getContext().getAuthentication().getPrincipal() != null &&
            SecurityContextHolder.getContext().getAuthentication().getPrincipal() instanceof OnlineUser
            ) {

            OnlineUser onlineUser = (OnlineUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
            RequestContext ctx = RequestContext.getCurrentContext();

            ctx.addZuulRequestHeader(ZULL_HEADER_USER_ID, onlineUser.getId());

        }
        return null;
    }
}

在此示例中,用户的ID附加到请求,然后将其路由到相应的服务。 此过程将在Spring Security执行用户授权后立即进行