Spring Cloud - 如何在Zuul反向代理上配置OAuth2RestTemplate以通过授权令牌?

时间:2017-08-07 20:49:43

标签: java spring spring-security spring-cloud netflix-zuul

我使用Zuul作为反向代理,将请求路由到我的微服务。我还在此反向代理上启用了资源服务器(@EnableResourceServer),因此请求授权我的授权服务器。没有资源服务器的配置,只有一些请求的安全性绕过,仅此而已。当将请求路由到其他微服务时,这个反向代理也简单地传递OAuth2头,因此其他微服务能够根据需要执行所有与安全相关的事情。一切都很完美......但是。

我创建的一个zuul过滤器是用于资源扩展的过滤器。这意味着它会根据提供的url参数自动获取所有相关资源(例如,对于员工资源,url参数可以是“expand = manager,contacts”,它使用员工资源上的HAL链接获取所有这些附加数据,并将其他数据添加到JSON中的_embedded字段。)

我遇到的问题是,当我进行此扩展时,我需要使用RestTemplate进行扩展(以获取应嵌入的所有数据)。我无法弄清楚如何配置OAuth2RestTemplate,因此它会将OAuth2授权标头添加到传出请求中。 我从spring cloud文档中尝试过这个:

@Bean
public OAuth2RestTemplate restTemplate(UserInfoRestTemplateFactory factory) {
    return factory.getUserInfoRestTemplate();
}

但是我有一些来自OAuth2TokenRelayFilter的空指针异常。这个过滤器htat中有一个条件如下:

restTemplate.getResource().getClientId()
                .equals(auth.getOAuth2Request().getClientId())

但是restTemplate.getResource()返回null,并且OAuth2Request实例上的getClientId()返回null ...看起来我真的错过了什么。

在介绍OAuth2之前,RestTemplate的设置是:

@Bean
@LoadBalanced
RestTemplate restTemplate() {
    return new RestTemplate();
}

因此,当您看到还需要负载平衡时(使用功能区进行负载平衡,Eureka用于基于一个服务别名的服务发现,因此zuul配置中没有直接URL)

任何建议如何设置?

谢谢, 卢卡斯

1 个答案:

答案 0 :(得分:0)

因此,经过一些调查后,我将反向代理配置为OAuth2Client,因此为每个请求OAuth2TokenRelayFilter开始正常设置安全上下文。

Spring云文档章节"资源服务器令牌中继"描述以下"其余模板将具有与身份验证过滤器"相同的OAuth2ClientContext(请求范围)。 ...这意味着客户端必须由@ EnableOAuth2Client启用,以便正确设置OAuth2ClientContext。

我希望我理解正确。

的Lukas