2012-03-21 93 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