2013-03-07 71 views
3

因此,我以不同的方式提出了這個問題here並沒有得到答案,所以我將嘗試重新翻譯它,因爲這似乎是一個非常簡單的問題。Rails基於cookie的會話:混合會話範圍和過期時間

我有一個基於cookie的會話的Rails應用程序。默認情況下,它們沒有任何expires_at時間戳,因此會話cookie的範圍是'session'。這是你的香草Rails會議的東西。

現在我想創建一個'演示用戶'功能,其中我在15分鐘後將用戶踢出去。要做到這一點,我想成立一​​個expires_at上Time.now +會話cookie 15.minutes

 session[:expires_at] = Time.now + 15.minutes

現在這上面這段代碼並執行,但對cookie的範圍沒有任何影響。範圍仍然是'會話'。如何將範圍從「會話」更改爲日期時間?

如果我在production.rb配置我的整個應用程序的會議上

 :expire_after => 24.hours

然後它會工作......但問題是,我要選擇性地控制對會話cookie的有效期。

編輯:我發現當我設置會話[:expires_at]時,cookie的範圍沒有任何影響的原因是因爲隨後的請求會破壞會話cookie並將其重新設置爲會話。仍然不知道該怎麼做。

回答

0

雖然不是很優雅的方式,但這個工程的一個會話:

... 
request.env['rack.session.options'] = {expire_after: 15.minutes} 
session[:user_id] = 1 
... 
2

也許不是依靠cookie的有效期(見2.9 "Ruby On Rails Security Guide"爲什麼它是壞的),類似於this answer,當會議在會議本身的創建商店時間戳(比如session[:created_at]),然後對每個請求檢查是否需要爲這些「演示用戶」過期:

before_filter :check_session 

def check_session 
    # TODO: check session validity 
    if session[:demo_user] && session[:created_at] > 15.minutes.ago 
    reset_session 
    # TODO: redirect to login page 
    end 
end 
+0

我喜歡這個解決方案是什麼OP的描述。它肯定會做你在問什麼,避免處理cookie過期,並讓你100%控制何時到期演示會話。 – awbergs 2013-03-18 02:02:59