我使用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)
任何建议如何设置?
谢谢, 卢卡斯
答案 0 :(得分:0)
因此,经过一些调查后,我将反向代理配置为OAuth2Client,因此为每个请求OAuth2TokenRelayFilter开始正常设置安全上下文。
Spring云文档章节"资源服务器令牌中继"描述以下"其余模板将具有与身份验证过滤器"相同的OAuth2ClientContext(请求范围)。 ...这意味着客户端必须由@ EnableOAuth2Client启用,以便正确设置OAuth2ClientContext。
我希望我理解正确。
的Lukas