我有一个非常简单的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)。
如何在这种情况下使授权适用于多个实例?
答案 0 :(得分:2)
Spring只存储cookie中会话的ID,但是数据在webserver(tomcat?)上的某个位置,并且由此id获取。当您的请求到达其他tomcat实例时,它只是无法将id连接到数据。你可以做的是看看使用redis而不是特定实例文件系统的spring会话项目。
其他方式 - 我不推荐但可能适合您的解决方案 - 是在LB上使用粘性会话。 LB会小心地将用户请求一遍又一遍地传递给同一个服务器。当然,这不是安全的解决方案,因为当网络服务器死亡时,您的用户将失去从应用程序的会话/注销。