2010-07-25 44 views
10

我正在開發將主持網絡直播的網站的用戶管理部分。目標是防止同時使用相同的用戶名(電子郵件地址)。也就是說,我們不希望兩個人使用一個登錄來查看事件。如何防止PHP/MySQL網站中的併發用戶登錄?

我已經設置了一個表,其中包含用戶註冊數據,其中的REGID作爲主鍵。我的想法是創建一個以用戶名爲主鍵的登錄歷史表,在註冊表中用戶名的外鍵。登錄歷史記錄表只會在用戶登錄到網站時顯示時間戳。但是,這並不能實現我阻止多個人使用相同登錄名的目標。

相反,在登錄歷史記錄或用戶表中設置登錄狀態字段1,登錄狀態字段設置爲1,登出狀態字段爲0會更好嗎?它需要一個存儲過程來更新登錄和註銷時的值,並且需要在用戶登錄時驗證,以便登錄狀態= 1時,用戶已登錄並且不能再次登錄。這是一種可行的方法嗎?

請分享您使用過的其他方法,以防止多人共享相同的登錄憑證。

感謝, 希德

回答

7

如果是正常使用相同的憑證註銷已登錄的用戶,如果別人登錄,那麼你可以做到以下幾點:當用戶登錄在你的數據庫爲用戶生成一個隨機ID,並在同一 cookie 會話。兩者必須匹配才能進行驗證。

+1

將「cookie」替換爲「會話」,這樣可以很好地工作。只要確保在每個請求上針對數據庫檢查會話值,並在用戶再次登錄時始終重置該值。兩個試圖查看該頁面的用戶將不斷記錄彼此。 – Charles 2010-07-25 20:01:08

+0

是的,很好的電話,更新後的帖子閱讀「會議」。 – MrWhite 2010-07-25 20:16:32

+0

我喜歡你的方法。唯一需要注意的是,第二個用戶在嘗試使用已經在使用的登錄名時會收到一條消息,指出用戶標識已經登錄,或者出現這種情況。我們希望確保觀看網絡直播的每個人都擁有自己的登錄憑證。謝謝:) – SidC 2010-07-25 20:25:05

0

這裏的問題是檢測用戶登錄(即他是否沒有註銷)。

一種可能的方法是在數據庫中註冊他上一次活動的時間和他明確註銷的時間。然後,如果相對於他最近的活動以及他沒有在兩者之間登錄的情況,這個嘗試的時間少於5分鐘,那麼您可以拒絕登錄。

您可以通過讓網站頁面週期性地使用Javascript輪詢服務器來強制「活動」。

+0

難道是可行的創建檢查loginhistory表,看看用戶是否在最後5分鐘登錄交易wihtout相應的註銷交易的功能? 謝謝:) – SidC 2010-07-25 18:51:24

+0

@SidC你可以但其他人可以在5分鐘後登錄。 – Artefacto 2010-07-25 19:39:41

0

很容易確定某人何時登錄。確定某人何時登出很難。如果你有一種快速殺死網絡直播給特定用戶的機制,你可能想要彈出一些詢問用戶是否想要殺死他們的其他會話,如果你認爲可能有一個活動。

-3

您可能想考慮在php中製作一個全局變量來存儲具有登錄狀態的哈希數組。這具有如下優點:如果應用程序由於某種原因必須重新啓動,則用戶不會陷入數據庫中的錯誤狀態。

您可以存儲從用戶標識到IP或會話cookie的映射,並將不同信息附帶的請求重定向到登錄頁面。如果用戶登錄,則另一個會話將失效,並且在上一個會話中的進一步請求轉發到登錄頁面。

0

你是如何在服務器上進行用戶會話的?如果將它們存儲在數據庫中,則可以在有人試圖登錄時查詢活動會話,看看它們是否已經在那裏。當然,您可能還需要檢查某種時間戳,因爲您無法保證會話將在session.gc_maxlifetime中消失。

2

沒有滾動你自己的會話處理程序,你可以做一點平行跟蹤。當用戶登錄時,可以將用戶的會話ID和登錄時間存儲在數據庫中(可能在用戶信息表中)。登錄腳本然後可以檢查是否存在該會話ID,並根據會話ID的存在來允許/拒絕登錄。如果ID爲空/空白,則用戶登錄。如果存在會話ID,並且其時間超過X分鐘,則允許登錄。否則否認他們。

當然,你可能想在這一點上推出自己的會話清理處理程序,所以,當陳舊的session文件被刪除,你可以從數據庫中,同時刪除相關的ID。

相關問題