Spring云RestTemplate添加身份验证令牌

Spring云RestTemplate添加身份验证令牌,spring,spring-security,netflix-zuul,Spring,Spring Security,Netflix Zuul,如何使用授权令牌正确实现restTemplate 我有一个Zuul网关,它将JWT下游正确地传递给其他服务,假设我不想首先在网关上执行任何操作,使用如下配置: zuul: sensitive-headers: routes: instance-service: path: /instances/** strip-prefix: false 以及使用令牌中继滤波器: @Component public class TokenRelayFilter exte

如何使用授权令牌正确实现restTemplate

我有一个Zuul网关,它将JWT下游正确地传递给其他服务,假设我不想首先在网关上执行任何操作,使用如下配置:

zuul:
  sensitive-headers:
  routes:
    instance-service:
      path: /instances/**
      strip-prefix: false
以及使用令牌中继滤波器:

@Component
public class TokenRelayFilter extends ZuulFilter {

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        Set<String> headers = (Set<String>) ctx.get("ignoredHeaders");
        headers.remove("authorization");

        return null;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 10000;
    }
}
我的
restemplate
只是一般性地连接起来

@Configuration
public class MyConfiguration {

    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
如何正确地将JWT返回到新的RestTemplate中,而不必在每个请求中手动创建和添加头


我是否应该使用
OAuth2RestTemplate

经过讨论,您似乎有两种选择:

  • 根据请求,通过
    @RequestParam
    实现和终结并挖掘Auth头。从那里,您可以通过
    restemplate
    将其重新添加到下游服务中,用于后续的出站请求

  • 使用Zuul代理您的请求(包括Auth头,确保其从
    敏感头
    配置中排除),并实现预筛选以包括您可能需要的任何其他逻辑


  • 如果我必须选择的话,这听起来像是Zuul应该做的事情,因为它很可能充当队列和其他服务的网关,而且看起来您正在尝试实现代理请求,Zuul已经可以做到了,但是,如果不知道体系结构的全部范围,很难说。

    试着让我的头脑有点不明白这一点-听起来好像你试图在Zuul路由器中托管一个不受代理约束的REST端点。该端点应该延伸到下游服务,但缺少这些服务(不是zuul)所需的某种授权头,从而导致来自下游服务的401。正确吗?正确,rest端点几乎可以建立CQR,向消息队列发送
    POST
    请求,并
    GET
    请求到正确的服务。您希望在Zuul中自动配置RestTemplate,以自动检测初始请求中的auth头,并重新使用它,与代理所做的类似?是的,再次更正!所以对于RestTemplate,因为我们实际上要处理两个请求(一个入站到Zuul,另一个出站到您的服务),我不确定除了通过@RequestHeader从Zuul的请求中删除auth头并手动将其添加到新的出站请求之外,是否还有更好的方法。我很好奇为什么这不能成为代理的一部分。如果我们必须将请求转发到下游服务,这难道不能存在于预过滤器中吗?
    @Configuration
    public class MyConfiguration {
    
        @LoadBalanced
        @Bean
        RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }