Spring Cloud Zuul Proxy

时间:2015-05-19 13:36:23

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

我目前正在开发基于微服务架构的应用程序。我们使用使用Spring Cloud Netfix的Zuul Server实现的API网关将请求路由到我们的微服务。

要实现我们所有服务的单点登录,我目前正在使用Spring Cloud Security设置OAuth2服务器。服务器基本上只是在Dave Syer的Repo中实现的复制和过去:https://github.com/dsyer/spring-security-angular/tree/master/oauth2/authserver

主要区别在于我想通过Zuul代理将请求路由到我的OAuth服务器。这样我就不必直接暴露我的OAuth服务器,并可以动态添加和删除Login Server。

问题是我不了解如何正确配置此设置。当我尝试访问OAuth服务器上的受保护资源时,我将转发到登录页面。这当然是预期的。但我无法弄清楚如何设置转发时使用的主机名和端口。我想要发生的是服务器转发到Zuul服务器上的端点,该端点将被代理回到OAuth服务器。 (Zuul API-Gateway应该是客户端与之交谈的唯一服务器。其他所有内容都将被隐藏。)

因为主机和端口是从HttpServletRequest中的LoginUrlAuthenticationEntryPoint读取的。但是服务器看到的请求是Zuul代理发送的请求。所以我被转发到内部IP而不是代理端点。

我尝试将WebSecurityConfigurerAdapter.configure(HttpSecurity)中的登录页面的URL设置为我的Zuul代理的绝对URL。但这只是导致我的应用程序抱怨太多的重定向。 (可能会在那里引起一个循环。)

设置它的最佳方法是什么?

  • 我是否必须通过覆盖bean来实现某种自己的转发策略?
  • 我缺少配置选项吗?
  • 我的想法本身是错的吗? (在他对How to avoid redirect to another host with Zuul?的回答中,Dave Syer说你通常不代理这个,但不能解释原因。)

2 个答案:

答案 0 :(得分:17)

更新:可在此处找到POC https://github.com/kakawait/uaa-behind-zuul-sample

您是否尝试过设置(在zuul服务器上):

zuul:
  routes:
    uaa-service:
      path: /uaa/**
      stripPrefix: false

security:
  # Disable Spring Boot basic authentication
  basic:
    enabled: false
  oauth2:
    sso:
      loginPath: /login
    client:
      accessTokenUri: https://<zuul hostname>/uaa/oauth/token
      userAuthorizationUri: https://<zuul hostname>/uaa/oauth/authorize
      ...

基本上它适用于我的项目,我唯一需要做的就是在CSRF路由上禁用/uaa/oauth/token保护。

Auth服务器应该在

server:
  # Use different context-path to avoid session cookie overlapping
  context-path: /uaa

使用Spring-Cloud.Brixton.M3

进行测试

感谢@thomas-letsch,您应该像下面的(示例)

一样调整安全性
public void configure(HttpSecurity http) throws Exception { 
    http.logout().and()
        .antMatcher("/**").authorizeRequests() 
        .antMatchers("/index.html", "/home.html", "/", "/uaa/oauth/**").permitAll() 
        .anyRequest().authenticated().and() 
        .csrf().csrfTokenRepository(getCSRFTokenRepository()).ignoringAntMatchers("/uaa/‌​oauth/token").and() 
        .addFilterAfter(createCSRFHeaderFilter(), CsrfFilter.class); 
} 

答案 1 :(得分:3)

据我了解您的问题,spring-cloud-security(对于EnableOauth2Sso部分)和spring-cloud(对于zuul),无法使用代理调用授权服务器zuul。 主要原因是spring-cloud-security独立地(并且在考虑之前)保护网关Zuul路由的逻辑。

这意味着(来自Dave Syer&#39; OAuth2示例的示例配置)spring.oauth2.client.*配置

spring:
  oauth2:
    client:
      accessTokenUri: http://localhost:9999/uaa/oauth/token
      userAuthorizationUri: http://localhost:9999/uaa/oauth/authorize
      clientId: acme
      clientSecret: acmesecret

在之前被视为,允许任意访问Zuul的路线zuul.routes.*

此外,此设置使客户端代理能够存储两个Cookie:一个用于网关,另一个用于授权服务器。

我希望这会有所帮助。