首页 文章

Spring Cloud Zuul Proxy背后的Spring OAuth授权服务器

提问于
浏览
24

我目前正在开发基于微服务架构的应用程序 . 我们使用使用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服务器上的 endpoints ,该 endpoints 将被代理回到OAuth服务器 . (Zuul API-Gateway应该是客户端与之交谈的唯一服务器 . 其他所有内容都将被隐藏 . )

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

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

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

  • 我是否必须通过覆盖bean来实现某种自己的转发策略?

  • 是否有我缺少的配置选项?

  • 我的想法本身是错的吗? (在回答_1351203时,Dave Syer说你通常不代理这个,但不能解释原因 . )

2 回答

  • 16

    Update :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
          ...
    

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

    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); 
    }
    
  • 3

    据我所知, spring-cloud-security (对于 EnableOauth2Sso 部分)和 spring-cloud (对于zuul),这是不可能使用zuul代理对授权服务器的调用 . 主要原因是 spring-cloud-security 独立地(并且在计算之前)保护网关Zuul路由的逻辑 .

    这意味着(样本配置来自Dave Syer的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
    

    被认为 before 允许任何访问Zuul的路线 zuul.routes.*

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

    我希望这有帮助 .

相关问题