App Engine 和 Spring Security:并发会话

Posted

技术标签:

【中文标题】App Engine 和 Spring Security:并发会话【英文标题】:App Engine & Spring Security: Concurrent sessions 【发布时间】:2012-04-05 22:53:09 【问题描述】:

我正在使用 Spring Security 实现我的 GAE + GWT 应用程序的身份验证层。我的问题是关于一个给定用户配置文件的并发会话。我想禁止任何用户同时使用同一帐户登录两次。

经过一些研究,我发现我可以在 Spring Security 中使用:

web.xml

<listener>
<listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>     
</listener>

在applicationContext.xml中

<session-management>
<concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
</session-management>

每当在 HttpSessionListener 中调用 sessionDestroyed() 时,HttpSessionEventPublisher 都会收到一个事件。但是,据我所知,App Engine 从未调用它。有一个issue about this

我应该如何使用 Spring Security 和 App Engine 实现会话并发限制?

【问题讨论】:

首先,您必须定义“同时”在此上下文中的含义。 HTTP 是基于请求的,而不是基于连接的;您无法判断用户何时停止使用您的网站 - 他们只是停止发送请求。 你说得对……当我这么说的时候,我是想说“会话时间”。现在,我正在使用给定用户配置文件使用的最后一个会话 ID 查询 _ah_SESSION 实体。如果会话未过期(_expires > now),我假设用户配置文件正在使用中并且我拒绝新连接。我必须在生产中尝试它。 这似乎是不受欢迎的行为 - 关闭笔记本电脑(未明确注销)并转到台式计算机登录的用户将被拒绝。如果你真的需要,最好自动注销任何其他会话。 【参考方案1】:

我不认为它会起作用,GAE 是一种云解决方案,它通过将会话存储在数据存储中来填充多 JVM 上的各种 http 会话,然后将它们传播到其他实例,它会在您的开发环境,但会将您放在实时服务器上,因此我不可能通过具有弹簧安全性的 GAE 允许单一会话解决方案。

【讨论】:

GAE 通过缓存和数据存储中名为 _ah_SESSION 的集合跟踪其会话对象。可以查询过期会话(_expires > now)。 唯一的事情是你应该自己清空这些数据,因为来自 HttpSessionListener 的 sessionDestroyed() 永远不会被调用。

以上是关于App Engine 和 Spring Security:并发会话的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine (Java) + Spring 管理的 PersistenceManager

在 Google App Engine 中部署 Spring Boot gradle 应用

部署到 Google App Engine 时 Spring Boot CORS 配置不起作用

是否可以将 Spring Boot 应用程序部署到 App Engine 并连接到数据库?

Spring Boot 应用在部署到 Google App Engine 时无法连接到 Google Cloud SQL (PostgreSQL)

Spring Boot GCP:将 PubSub 应用程序部署到 App Engine 标准环境时出现“Google 凭据”异常