2012-11-23 56 views
0

假設我們有這個令人敬畏的User系統,用戶通過會話密鑰(user_id)登錄。如果用戶被「禁止」,用戶仍將登錄 - 直到會話過期。在執行操作時執行某個任務

方法來防止這種情況是:

  1. 務必檢查用戶是否得到禁止(每個請求)

  2. 保存會話數據,或許一個數據庫,能夠很容易地刪除數據(上用戶被禁止)。

是否有更好的方法來執行此任務?

+0

如果您選擇第二種方法,請記住您只能在數據庫中保存會話標識符,然後[用它來終止此會話](http://stackoverflow.com/questions/6703842/unset-a- specefic-session-using-session-id)阻止用戶。 – Furgas

+0

如果有人被禁止,禁令需要一段時間才能得到執行,這有什麼關係嗎? –

回答

1

我會選擇。如果您在每個請求中都沒有從數據庫中檢索用戶信息,則用戶可能在更新其數據時遇到問題。例如,我可以在家登錄,將我的個人資料描述更改爲'foo'並開始工作。在那裏我也登錄,這會導致不同的會話。我將信息更改爲「欄」,該欄存儲在數據庫和工作會話中。然後,我回家並繼續瀏覽之前打開的本地會話,該會話仍將包含'foo'。

因此,我認爲您至少應該對每個請求的用戶數據庫進行一些檢查,因此在此步驟中您可以檢查用戶是否被禁止。

爲了加快速度,可以使用存儲類型爲MEMORY的特殊表來保留會話信息。該表可以非常快速地訪問,因此可以提高性能。如果用戶在「真實」數據庫中進行了更改,則只需在該處移動信息。您可以以類似的方式使用memcache。這兩種解決方案都能將數據庫IO保持在最低水平,同時仍具有相同的結果。我只會在需要時才添加這些優化。從查詢每個請求的用戶開始。

0

只是在會議上最後一次檢查它是否被禁止。然後定期對禁止的用戶列表進行檢查。

0

你必須檢查它的每一個請求user_id。這不是太多的計算。您可以使用內存中的存儲空間(如RedisMemcached)來存儲user_id=>banned對,以便快速進行檢查。其次,因爲會話不穩定,我可以從不同的計算機甚至瀏覽器登錄,因此您將需要複雜的邏輯和更多資源來執行此類任務。

0

你真的不希望被連接到數據庫上,因爲這會大大增加服務器上的負載時間與許多用戶每一個請求 - 它只是沒有做到的最好的事情。

你可以使用,無論Memcache來存儲和檢索從禁止用戶列表 - 從而加快了數據的請求倍。

if((isset($_SESSION['isloggedin']) && $memcache->get('banneduserid') === true)) 
{ 
    session_unset(); 
    session_destroy(); 
} 

Memcache是很容易使用,而且學習的樂趣,如果你還沒有使用過。

例如,您將memcache對象實例化爲$ memcache,然後您只需運行$memcache->set()$memcache->get()等方法。而已!

+0

這也是一個很好的建議,你的數據處理更新Memcache與禁止用戶列表可以運行一個cron說,每5分鐘,在您的服務器上。這從安全角度分離了關注點並且通常更好。我已經完成了與你完全相同的工作,並且我的方法完美無瑕:) – Jimbo