Spring OAuth Authorization Server behind Spring Cloud Zuul Proxy

我目前正在开发一个基于微服务架构的应用程序。我们使用使用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 Proxy将请求路由到我的OAuth服务器。这样,我就不必直接公开我的OAuth服务器,并且可以动态添加和删除登录服务器。

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

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

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

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

  • 我是否必须通过覆盖 Bean 来实现某种自己的转发策略?
  • 是否有我缺少的配置选项?
  • 我的想法本身是错误的吗?(在他的回答如何避免重定向到另一个主机与Zuul?Dave Syer说你通常不会代理这个,但没有解释为什么。

答案 1

更新: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

身份验证服务器应处于打开状态

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

答案 2

据我所知,您的问题(对于部分)和(对于zuul),这不可能使用zuul代理对授权服务器的调用。主要原因是独立(并在考虑之前)保护网关的Zuul路由逻辑。spring-cloud-securityEnableOauth2Ssospring-cloudspring-cloud-security

这意味着(来自 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

在允许任何访问Zuul路线之前被考虑zuul.routes.*

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

我希望这有帮助。


推荐