【问题标题】:Spring Session/OAuth2 multi tenant application / multiple cookiesSpring Session/OAuth2 多租户应用程序/多个 cookie
【发布时间】: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

【问题讨论】:

标签: spring spring-boot session cookies oauth-2.0


【解决方案1】:

OAuth2 的工作原理如下:

访问令牌仅授予该租户,不能用于访问其他租户的资源。

然后租户网站需要存储这个访问令牌以供以后使用,或者它可以存储在:

  1. Cookie - 没有问题,因为每个租户都有不同的域。
  2. 本地存储 - 你没有问题,因为它也是不同的存储。

SESSIONID 是 Spring 创建的 cookie,在这种情况下不会用到。

【讨论】:

    猜你喜欢
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2011-05-05
    相关资源
    最近更新 更多