2012-03-21 85 views
3

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

一些研究之后,我发现我可以在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> 

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

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

+0

首先,你将不得不定义在这种情况下'同时'的含义。 HTTP是基于请求的,而不是基于连接的;你无法知道用户何时停止使用你的网站 - 他们只是停止发送请求。 – 2012-03-22 16:50:08

+0

你是对的......当我说的时候,我打算说“会话时间”。现在,我使用给定用户配置文件使用的最后一个会话Id查询_ah_SESSION实体。如果会话没有过期(_expires>现在),我假设用户配置文件正在使用,我拒绝新的连接。我必须在生产中尝试它。 – 2012-03-24 08:08:05

+0

这似乎是不受欢迎的行为 - 关闭笔记本电脑(未明确注销)并转至其台式计算机登录的用户将被拒绝。如果您真的必须自动注销其他任何会话,那就更好了。 – 2012-03-24 09:37:42

回答

0

我不认为它会工作,GAE是一个云解决方案,它通过将会话存储在数据存储中然后将它们传播到其他实例上,从而在多JVM上填充各种http会话,在你的开发环境中,但是会让你置身于现场服务器上,所以我不能通过GAE为Spring安全提供单会话解决方案。

+0

GAE通过缓存和数据存储中名为_ah_SESSION的集合跟踪其会话对象。可以查询过期的会话(现在是_expires>)。 – 2012-10-09 19:14:48

+0

唯一的是你应该自己清空这些数据,因为HttpSessionListener中的sessionDestroyed()永远不会被调用。 – 2012-10-09 19:23:57