2013-01-07 212 views
0

我使用cakephp 2和AuthComponent一起對我的web應用程序上的用戶進行身份驗證。至關重要的是,用戶不會自動註銷很長一段時間(至少24小時,更長或無限是最好的)。原因是我們在cakephp webapp中存儲了許多必須在幾秒鐘內可供當前登錄用戶使用的內容,而不會強制他輸入密碼。爲此,我已經設置Security.levellow,我還實施防止自動註銷cakephp

Configure::write('Session.timeout', 3000); 

這應該給用戶一個很好的兩天了他被註銷了。然而,即使用戶已經在同一分鐘內處於活動狀態,用戶仍會不時註銷。我不知道它何時發生,以及如何重現它,但我想知道我是否可能錯過了某些東西,其他策略可能有助於解決我的問題。

作爲一個網絡服務器,我在Ubuntu 12.04上使用標準apache,沒有任何特殊的配置更改!

回答

0

爲了讓這項工作有效地進行,您將分兩部分進行。我不能專門針對您正在使用的組件,但我可以提供一般操作理論。

PHP會話永遠不應該被認爲會持續很長時間。當用戶在網站上時,它們將處於活動狀態,但最終會清理乾淨。那麼如何讓用戶會話「永不過期」?

當用戶登錄時,您將創建一個唯一的一次散列。這個散列將作爲一個cookie存儲在用戶中,你也應該在你的數據庫中引用它(散列關聯的用戶)

這個散列提供了另一種登錄路徑。如果用戶返回到站點並且沒有會話,而不是將其指向登錄頁面,則會看到用戶是否擁有cookie。如果他們這樣做,您可以將它們重新登錄。

現在它的重要性在於只允許使用該散列一次。在散列用於創建會話之後,您需要生成一個新的散列並使用新散列更新cookie和數據庫。

有些事情要記住:

  • 哈希應該是唯一的,並用隨機數據生成。它應該不是一件容易被僞造的東西。
  • 如果用戶使用多個設備訪問您的網站,其可能的每個設備都將擁有自己獨特的散列,請牢記使用 數據庫設計。
  • 它是一個好主意,使用SSL,以便哈希不容易被嗅探。
  • 散列應該在一定的時間內過期,以便舊的散列不能用於登錄到該網站。
+0

這是一個非常好的主意,我非常喜歡它,雖然使用標準的cakephp AuthComponent很難實現。兩個問題:散列應該多久?爲什麼在創建新會話時必須重新生成? – schneida

+0

長度不是一個問題,最重要的是唯一性和僞造哈希的難度。 'md5($ userid)'會很糟糕。它使得哈希可預測。像'md5(microtime())'可能工作得很好。由於cookie存儲在客戶端,因此它們可以被第三方讀取。您可以爲用戶提供散列,並且無需用戶名或密碼即可登錄。如果哈希得到重新生成並且只允許使用一次,它會減少持久會話的安全風險。 – datasage

+0

姆姆,所以如果一個壞的用戶將cookie複製到他的瀏覽器,他將能夠登錄到系統,並且因爲cookie被重新生成,真正的用戶將被註銷,因爲他的cookie現在不再有效。那麼我認爲這對我來說已經足夠了!非常感謝! – schneida

0
CREATE TABLE cake_sessions (
    id varchar(255) NOT NULL default '', 
    data text, 
    expires int(11) default NULL, 
    PRIMARY KEY (id) 
); 

然後在core.php中改變會話設置:

Configure::write('Session', array(
    'defaults' => 'database', 
    'timeout' => 43200, 
    'cookieTimeout' => 43200 
)); 

此設置爲1個月會話