【问题标题】:Spring OAuth2 SSO behind load balancer负载均衡器后面的 Spring OAuth2 SSO
【发布时间】:2018-03-24 06:03:59
【问题描述】:

我有一个非常简单的带有社交单点登录功能的 Spring Boot 应用程序。

看起来像这样:

@Configuration
@EnableOAuth2Sso
class Application {
  // beans
}

并且它在application.yml 中有必填项:

security:
  oauth2:
    client:
      # clientId: ...
      # clientSecret: ...
      accessTokenUri: https://www.googleapis.com/oauth2/v3/token
      userAuthorizationUri: https://accounts.google.com/o/oauth2/auth
      tokenName: oauth_token
      authenticationScheme: query
      clientAuthenticationScheme: form
      scope: email
    resource:
      userInfoUri: https://www.googleapis.com/userinfo/v2/me
      preferTokenInfo: false

它在我的本地机器上运行良好,并且只启动了一个实例。

当有多个实例隐藏在负载均衡器后面时,就会出现问题。

即使用户在第一个请求中进行了身份验证,对负载均衡器的后续请求也会因 401 而被阻止。

与第一个相比,请求被路由到不同的应用实例。


我试图弄清楚,如何使用 JWT 或 JDBC 使其无状态,以便它可以跨多个实例工作。不幸的是,我没有在网上找到任何可行的示例。

其中一些需要启动授权服务器。但这不是我的情况,因为我想将授权完全转发给第三方提供商(例如 Google)。

在这种情况下我应该怎么做才能使授权跨多个实例工作?

【问题讨论】:

    标签: java spring spring-boot oauth-2.0 spring-security-oauth2


    【解决方案1】:

    Spring 仅将会话的 ID 存储在 cookie 中,但数据位于网络服务器(tomcat?)上的某个位置,并通过该 ID 获取。当您的请求命中其他 tomcat 实例时,它只是无法将 id 连接到数据。您可以做的是查看使用 redis 而不是特定实例文件系统的 spring session 项目。

    其他方式 - 我不推荐但可能适合您的解决方案 - 是在 LB 上使用粘性会话。 LB 会小心地将用户请求一遍又一遍地传递给同一台服务器。当然,这不是安全的解决方案,因为当网络服务器死机时,您的用户将失去会话/从应用程序注销。

    【讨论】:

    • 谢谢,最后我使用了带有redis的spring session作为后端。不幸的是,我也在使用 Vaadin,它在此类基础设施中给我带来了另一堆问题,但最后我用一些肮脏的黑客手段克服了这些问题。感谢您的提示!
    • 它没有帮助,我使用 Spring Session Redis 的其他解决方案 - docs.spring.io/spring-session/docs/current/reference/html5/…
    • "你可以做的是看看使用redis而不是特定实例文件系统的spring session项目。"
    猜你喜欢
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2021-12-07
    • 2017-05-25
    • 2015-06-17
    • 2011-01-10
    相关资源
    最近更新 更多