【发布时间】:2018-01-15 06:24:33
【问题描述】:
我使用 Zuul 作为反向代理,将请求路由到我的微服务。我还在此反向代理上启用了资源服务器 (@EnableResourceServer),因此请求被授权针对我的授权服务器。没有资源服务器的配置,只是对一些请求进行了一些安全绕过,仅此而已。在将请求路由到其他微服务时,此反向代理也只是简单地传递 OAuth2 标头,以便其他微服务能够根据需要执行所有与安全相关的事情。一切都很完美......但是。
我创建的 zuul 过滤器之一是用于资源扩展的过滤器。这意味着它会根据提供的 url 参数自动获取所有相关资源(例如,对于员工资源,url 参数可以是“expand=manager,contacts”,它使用员工资源上的 HAL 链接获取所有这些附加数据,并将附加数据添加到_在 JSON 中嵌入字段)。
我遇到的问题是,当我做这个扩展时,我需要使用 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();
}
如您所见,还需要负载平衡(使用 Ribbon 进行负载平衡,Eureka 用于基于一个服务别名的服务发现,因此 zuul config 中没有直接 url)
任何建议如何设置它?
谢谢, 卢卡斯
【问题讨论】:
-
据我所知,OAuth2RestTemplate 将尝试从 OAuth2 服务器获取新令牌,而不是将现有令牌传递给您的员工资源。尝试提供只会传递现有令牌的自定义令牌提供程序。
-
@tsolakp 但是我没有在这个代理上配置 OAuth2 客户端,所以它不知道 clientId 和 clientSecret。所以实际上这可能是问题所在。但是,我从 spring 云文档章节之一(关于令牌中继)中了解到,它应该只与资源服务器一起使用,并且不需要 OAuth2 客户端。
标签: java spring spring-security spring-cloud netflix-zuul