负载平衡器后面的Spring OAuth2 SSO



我有一个非常简单的带有Social Single Sign-On功能的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使其成为无状态,从而使其跨多个实例工作。不幸的是,我在网上找不到任何可用的例子。

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

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

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

另一种方法是在LB上使用粘性会话,我不推荐,但对您的解决方案来说可能还可以。LB会一次又一次地将用户请求传递到同一服务器。当然,这不是一个安全的解决方案,因为当网络服务器死亡时,您的用户将失去会话/从应用程序注销。

最新更新