2013-08-26 46 views
0

我正在使用webapp2的appengine應用程序。我基於我在this article中提出的想法進行認證。Webapp2列表(和/或殺)用戶的所有會話(Appengine Python)

我添加了刪除帳戶(這是應用程序的要求)的功能,並且遇到了會話問題。如果用戶從多個位置登錄,則該用戶將有兩個身份驗證令牌。當帳戶從其中一個登錄名中被刪除時,該登錄名的會話被銷燬。但是,其他登錄將在數據存儲中具有身份驗證令牌。

我修改了user_required/check_login修飾符/函數,以便它首先在會話中查找用戶。如果它找不到,我讓客戶知道他們需要登錄。如果找到了,我會從數據存儲中獲取用戶。如果它是None,那麼我假設有多個登錄,而另一個帳戶被刪除(這也會刪除用戶)。因此,我終止會話,並告訴客戶端用戶不再存在。否則,我會檢查用戶是否已通過驗證,如果不是,我會告訴客戶必須驗證用戶才能執行任何操作。

如果帳號被刪除,我寧可殺死用戶的所有會話。有沒有辦法做到這一點?我也想要這個功能,這樣我就可以擁有一個功能,登錄的用戶可以看到該用戶的所有會話,並隨意殺死/撤銷它們(有點像Facebook和Google,我相信很多的其他服務)報價。

編輯:即使我可能會最終得到從數據存儲用戶在某些時候反正,當我打電話self.user它是一個webapp2.cached_property,我還是寧可不要讓用戶在每個請求的開頭都用user_required裝飾,如果我可以逃脫只從會話中拉取信息。

+0

如果您在針對數據存儲區的每個請求中檢查用戶的會話,那麼我認爲您已經在盡力了。在這種情況下,除非實際詢問是否可以刪除用戶計算機上的Cookie,否則這是不可能的。 – dlebech

+0

@dlebech當我說擺脫了會話,我的意思是把它從數據存儲區中取出,以便下一次用戶嘗試使用該登錄名時,user_required方法將會說該會話沒有用戶。無論是因爲用戶刪除了帳戶,還是因爲用戶撤銷了該會話(如果我能夠列出該用戶的所有當前會話並允許用戶「撤銷/刪除」會話(意思是在數據存儲中刪除它)) – Eliezer

+0

感謝您的澄清。在這種情況下,我認爲[來自dragonx的答案](http://stackoverflow.com/a/18447663/2021517)是適當的。 – dlebech

回答

2

聽起來像你正在使用數據存儲後端進行會話。

最好的方法可能是修改會話框架,以便會話實體存儲您的用戶標識。這樣你可以通過用戶ID查詢會話實體,然後刪除它們並將它們從memcache中清除。

或者,您可以將會話存儲在您的用戶實體中,當您刪除用戶時,請通過該列表並擺脫所有會話。儘管如此,從用戶實體清理即將到期的會話可能有點痛苦。

+0

我將如何修改會話框架?它會像'DatastoreSessionFactory'的子類一樣嗎?您還提到清理即將到期的會話。我是否應該有一個運行每個x並刪除已過期的令牌的cron作業,還是框架可以處理? – Eliezer