【发布时间】:2019-06-12 03:01:01
【问题描述】:
我使用 Spring Session 和 OAuth2 为多租户应用程序构建 SSO,并拥有一个具有不同前端客户端和后端服务器的应用程序。
(我使用了这个教程https://www.baeldung.com/sso-spring-security-oauth2)。
所以现在的问题是每个客户端(租户)运行在与后端服务器不同的域上,因此后端服务器只有一个 cookie,用户无法同时登录两个不同的租户。 (每个租户都有不同的不记名令牌,所以只有 cookie 是问题)
想法本来是以某种方式配置 spring 以在服务器上创建不同的 SESSION cookie(我没能做到/不知道这是否可能)
此外,我不明白为什么我需要那个 cookie,因为我使用的是基于令牌的身份验证。
我确实明白,如果我想在用户关闭浏览器并再次打开时自动登录,我需要在客户端保存一些数据(例如 cookie,但为什么要为此使用 JSESSIONID 而不要将不记名令牌保存在 cookie 中)
此外,我相信在登录过程之后,会话 cookie 用于授权,而不是 oAuth 令牌。 (我从令牌存储+刷新令牌中删除了它,在下一个请求时它只是创建了一个新令牌)
所以基本上我想知道的是:
- 我能否以某种方式将我的后端配置为为每个租户创建一个 cookie? (不运行多个实例)
- 为什么需要会话 cookie?
- 在我从令牌存储中删除令牌后,用户如何在 oAuth 中重新进行身份验证,而无需再次输入密码(我猜会话 cookie 对此负责)
我的 yaml 配置如下所示:
server:
port: 8082
servlet:
context-path: /ui
session:
cookie:
name: UISESSION
security:
basic:
enabled: false
oauth2:
client:
clientId: SampleClientId
clientSecret: secret
accessTokenUri: http://localhost:8081/auth/oauth/token
userAuthorizationUri: http://localhost:8081/auth/oauth/authorize
resource:
userInfoUri: http://localhost:8081/auth/user/me
client2:
clientId: SampleClientId
clientSecret: secret
accessTokenUri: http://localhost:8081/auth/oauth/token
userAuthorizationUri: http://localhost:8081/auth/oauth/authorize
resource:
userInfoUri: http://localhost:8081/auth/user/me
【问题讨论】:
-
实际上有一种方法可以在春季处理多个会话,如果您不是在寻找多个 cookie,这很容易找到。 (docs.spring.io/spring-session/docs/1.3.4.RELEASE/reference/…),但由于春季的有线错误,最后我只是将用户从另一个租户中注销。
标签: spring spring-boot session cookies oauth-2.0