2015-03-25 22 views
2

在我的Yii應用程序中,我想阻止同一用戶同時登錄。Yii更新瀏覽器選項卡上的數據庫字段關閉

1.用戶登錄時,我將DB字段logged_in更新爲1.因此,如果同一用戶再次登錄,我檢查此字段(logged_in),如果它的1則拋出'用戶已連接'。

2.我也註銷用戶,如果他在30分鐘內不活動。

我想執行的瀏覽器選項卡接近以下操作,

1.破壞會議

2.更新數據庫領域LOGGED_IN爲0

回答

1

當用戶登錄我更新數據庫字段logged_in爲1.因此,如果同一用戶再次登錄我檢查此字段(logged_in),如果它的1然後拋出'用戶已連接'。

當用戶試圖登錄。

如果新的登錄具有不同的會話ID和/或IP,就應該拋出一個錯誤(每應該比較IP和會話ID(Yii::app()->getSession()->getSessionId())你請求),但我建議避免用戶忘記註銷並不得不等待30分鐘,並重寫舊會話的沮喪。因此,如果用戶在同一時間段內從其他位置登錄,則可以覆蓋會話ID和IP地址,舊會話將自動註銷。

所以,你應該在DB這些領域的用戶:

ip_address  | session_id   | last_active 

你應該保持last_active領域更新的比較準確。

我也註銷用戶,如果他是30分鐘不活動。

每當用戶試圖登錄,或進入一個頁面(你無論如何都應該進行重新認證): - 如果用戶已經在最後30分鐘被激活,而其他信息相匹配,這是當前會話和登錄爲空(可以忽略並定期繼續)。 - 如果用戶在30分鐘或更長時間內不活動,則應該將這個新登錄信息寫入舊信息。所以,新的IP地址和會話ID。 - 如果用戶一直處於活動狀態,但信息不同,請輸入錯誤信息(就像我說的那樣,我會避免這樣做)。

您可以讓會話cookie在30分鐘後過期,以便在會話cookie處於非活動狀態時生成新的會話ID。 在每一頁輸入,如果用戶登錄,覆蓋cookie,它會給它一個新的失效日期。 如果距上次活動超過30分鐘,用戶將自動獲得新的會話ID,從而使上次會話和登錄無效,並強制它們再次登錄。

破壞會議

在最後一個點覆蓋。

+0

選項卡上的接近如何更新數據庫字段LOGGED_IN爲0? – 2015-03-25 12:07:44

+0

不錯的解決方案。我同意。關閉選項卡上的觸發事件不是一個好的解決方案,您的方法會更好。 – hamed 2015-03-25 12:09:40

+0

@AyyanarG我更新了答案更具描述 - 我認爲你應該避免這種想法,你永遠不知道,如果有人禁用JS,這是很容易的手動覆蓋在客戶端上。將它保留在服務器端(只能通過服務器端觸發tab) – casraf 2015-03-25 12:11:59

相關問題