2009-08-07 74 views

回答

8

問題是cookies是客戶端。顯然,在服務器上運行rake任務不會在所有訪問過網頁的機器上刪除cookie。

也許你可以在控制器中以某種方式使用session.clear?不過,您更改Cookie密鑰是正確的。這樣做會使屬於舊密鑰的任何會話失效。你將不得不從ActionController::StaleSession(或類似的東西)救援,但它會工作。

+2

正如我在我的評論中提到的,我錯誤地認爲cookie只保留客戶端和服務器之間的某種會話令牌,並且令牌也存儲在服務器端以驗證客戶端的令牌或數據位於服務器端。 暫時我只是在我的代碼中有一個解決方法來忽略會話。也許最簡單的事情是切換到開發環境的數據庫支持的cookie存儲(我只想爲了開發目的而清除會話)。 – user85509 2009-08-08 01:15:10

3

現在我發現,根據基於cookie的商店的實施方式,我想要的可能無法實現。如果cookie包含服務器需要的所有信息(包括用於數據完整性的簽名),則服務器無需在其一側存儲任何信息,因此無法使現有Cookie無效。我假設cookie包含一些與服務器端數據相對應的密鑰,以驗證cookie是否有效,但現在我意識到情況並非如此。

如果這是真的,那麼清除cookie的唯一方法是更改​​用於簽名的服務器端cookie密碼,然後可能重新啓動服務器進程。

+0

更改了config.secret_token並重新啓動了服務器。 Cookie會話已重置。結果。 – patrickmcgraw 2011-09-11 03:46:48

9

更改會話cookie的名稱。它不會刪除舊的Cookie,但會強制每個人都獲得新的會話cookie。

24

如果使用基於Cookie的會話

你可以改變你的Rails應用程序的secret_token。這將使所有現有會話無效。

rake secret 

然後到

RAILS_ROOT/config/initializers/session_store.rb 

這就是它的值複製。記得重新啓動後,這是你的應用程序;)

如果您如果您使用基於文件的會話

rake tmp:sessions:clear 
+4

我不得不將值複製到secret_token.rb – 2013-07-15 05:49:37

1

如果您在運行此使用基於數據庫會話

rake db:sessions:clear 

生產服務器我推薦:

rake secret 

這只是生成一個隨機安全令牌。 rake任務基本上是這樣做的,你可以在控制檯中完成。

SecureRandom.hex(64) 

不要將生產密鑰檢入版本控制/ GIT,而應使用環境變量。因此,在您的config/secrets.yml文件中使用類似於:

production: 
    secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> 
相關問題