使用 Spring Boot 在单个浏览器会话中使用多个 OAuth2 客户端

Posted

技术标签:

【中文标题】使用 Spring Boot 在单个浏览器会话中使用多个 OAuth2 客户端【英文标题】:Using multiple OAuth2 clients in single browser session using Spring boot 【发布时间】:2019-02-05 09:52:22 【问题描述】:

我们有使用 Spring Boot + Spring Security 设计的多租户 WebApp。此应用用于管理 Azure 中的某些资源。用户使用 OAuth2.0 登录我们的 WebApp,并可以通过我们的应用访问 Azure 资源。

现在我们需要允许多个用户在单个浏览器会话中登录我们的应用程序。所以基本上用户(用户 1)将使用凭据 1 登录以访问这些凭据允许的资源。然后用户将使用凭据2(基本上是另一个用户凭据,我们称之为 user2)登录到相同的浏览器页面。同一会话中将有两个活动用户。用户应该能够在这些帐户之间切换。

一旦用户登录到我们的应用程序,我们就会实例化 RestTemplate(使用输入的凭据)以访问 Azure 资源。

我们可以将单个 JSession id 映射到多个 RestTemplate 或将多个 JSession ID(在单个 JSession cookie 中)映射到单个 RestTemplate。我们可以有请求参数来指示使用哪个 RestTemplate。

我们已经使用 SpringSecurity 来获取访问令牌。然后在 RestTemplate 中使用此访问令牌并用于访问 Azure 资源。

【问题讨论】:

好吧,我想在不创建会话的情况下开发无状态服务。因此,您可以拥有任意数量的客户。您也可以在前端使用 OAuth 来保护您的服务 安杰洛说的有道理。你就不能无国籍吗? 【参考方案1】:

"现在我们需要允许多个用户单次登录我们的应用程序 浏览器会话”

这种方法是否安全?我的意思是,不建议让两个用户使用同一个浏览器并共享信息。

"我们可以将单个 JSession id 映射到多个 RestTemplate 或多个 JSession ID(在单个 JSession cookie 中)映射到 个人 RestTemplate"

我从未见过这种方法。以谷歌为例——你可以切换个人资料,但需要登录。

如果您确实需要这样做,可以使用名为 SessionBox 的 Chrome、Firefox 和 Opera 开箱即用解决方案,它可以在同一个浏览器中进行会话切换。否则,两种常见的解决方案是:

使用两种不同的浏览器(例如 Chrome 和 Firefox) 使用隐身模式

【讨论】:

以上是关于使用 Spring Boot 在单个浏览器会话中使用多个 OAuth2 客户端的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 测试中模拟会话关闭/过期?

java spring boot / spring security(HttpSecurity)中的会话到期时如何自动注销

单个休眠会话中的多个事务(使用 Spring)

在spring boot中使用JDBC和spring data jpa为我的会话spring创建单独的数据源

Spring Boot,Spring Security,会话范围 Bean 的会话超时问题,@PreDestroy

通过 spring-boot 进行 Spring WS UsernameToken 身份验证 + 会话管理