我正在开发一个基于微服务架构的应用程序。我们使用了使用Spring Cloud Netflix的Zuul服务器实现的API网关来将请求路由到我们的微服务。
为了实现所有服务的单点登录,我目前正在使用Spring Cloud Security设置OAuth2服务器。该服务器基本上只是Dave Syer Repo中实现的复制和粘贴:https://github.com/dsyer/spring-security-angular/tree/master/oauth2/authserver
主要区别在于我想通过Zuul代理将请求路由到我的OAuth服务器。这样,我就不必直接暴露我的OAuth服务器,并且可以动态添加和删除登录服务器。
问题在于我似乎不理解如何正确配置此设置。当我尝试访问OAuth服务器上的受保护资源时,我会被转发到登录页面。这当然是预期的。但是我无法弄清楚如何设置在转发时使用的主机名和端口。我希望发生的是服务器将转发到Zuul服务器上的一个端点,该端点将被代理回OAuth服务器。(Zuul API-Gateway应该是客户端交互的唯一服务器,其他所有内容都将被隐藏。)
现在,主机名和端口是从HttpServletRequest
中读取的,并且是在LoginUrlAuthenticationEntryPoint
中设置的。但是服务器看到的请求是由Zuul代理发送的请求。因此,我被转发到内部IP而不是代理上的端点。
我尝试在WebSecurityConfigurerAdapter.configure(HttpSecurity)
中将登录页面的URL设置为我的Zuul代理的绝对URL。但是这只会导致我的应用程序抱怨太多重定向。(可能引起了循环。)
什么是最佳设置方式?
- 我是否必须通过覆盖bean来实现某种自己的转发策略?
- 有没有我忽略的配置选项?
- 我的想法本身是否错误?(在他回答如何避免使用Zuul重定向到另一个主机的问题时,Dave Syer说你通常不会代理这个请求,但没有解释原因。)