Spring负载均衡器后面的OAuth2 SSO

时间:2017-10-12 10:25:58

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

我有一个非常简单的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)。

如何在这种情况下使授权适用于多个实例?

1 个答案:

答案 0 :(得分:2)

Spring只存储cookie中会话的ID,但是数据在webserver(tomcat?)上的某个位置,并且由此id获取。当您的请求到达其他tomcat实例时,它只是无法将id连接到数据。你可以做的是看看使用redis而不是特定实例文件系统的spring会话项目。

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