[英]Implementation of "Remember me" in a Rails application
我的 Rails 應用程序有一個帶有“記住我”復選框的登錄框。 即使關閉瀏覽器,選中該框的用戶仍應保持登錄狀態。 我通過將用戶的 id 存儲在用戶的會話中來跟蹤用戶是否登錄。
但是會話在 Rails 中是作為會話 cookie 實現的,它不是持久的。 我可以讓他們堅持:
class ApplicationController < ActionController::Base
before_filter :update_session_expiration_date
private
def update_session_expiration_date
options = ActionController::Base.session_options
unless options[:session_expires]
options[:session_expires] = 1.year.from_now
end
end
end
但這似乎是一種黑客行為,對於如此常見的功能而言,這令人驚訝。 有沒有更好的辦法?
編輯
Gareth 的回答非常好,但我仍然希望熟悉 Rails 2 的人的回答(因為它是獨一無二的CookieSessionStore
)。
您幾乎肯定不應該將會話 cookie 擴展為長期存在。
盡管本文沒有專門處理 rails, 但還是會用一定的篇幅來解釋“記住我”的最佳實踐。
總之,你應該:
作者還建議在每次登錄時使隨機值無效並重置 cookie。 就我個人而言,我不喜歡這樣,因為這樣您就無法在兩台計算機上登錄站點。 我傾向於確保我的密碼更改功能也重置隨機值,從而鎖定其他機器上的會話。
最后,他給出的關於使某些功能(密碼更改/電子郵件更改等)對自動驗證會話不可用的建議非常值得遵循,但在現實世界中很少見。
我花了一段時間思考這個問題並得出了一些結論。 默認情況下,Rails 會話 cookie 是防篡改的,因此您真的不必擔心 cookie 在客戶端被修改。
這是我所做的:
當用戶選中“記住我”框時,我只是將會話 [:expireson] 日期設置為登錄 + 2 周。 沒有人可以竊取 cookie 並永遠保持登錄狀態或偽裝成另一個用戶,因為 rails 會話 cookie 是防篡改的。
我建議您查看 RESTful_Authentication 插件,它有一個實現,或者只是將您的實現切換為使用 RESTful Authentication_plugin。 關於如何在 Railscasts 中使用這個插件有一個很好的解釋:
railscasts #67 restful_authentication
這是插件本身的鏈接
restful_authentication 插件有一個很好的實現:
http://agilewebdevelopment.com/plugins/restful_authentication
請注意,您不想保留他們的會話,只想保留他們的身份。 當他們返回到您的網站時,您將為他們創建一個新的會話。 通常,您只需為用戶分配一個 GUID,將其寫入他們的 cookie,然后在他們回來時使用它來查找他們。 不要使用他們的登錄名或用戶 ID 作為令牌,因為它很容易被猜到,並允許狡猾的訪問者劫持其他用戶的帳戶。
這是一個很好的寫一個人創建30天持久會話的經驗。
警告:博客文章是從2006年開始的
http://grahamglass.blogs.com/main/2006/05/rails_sessionsr.html
這對我來說就像一個魅力:
http://squarewheel.wordpress.com/2007/11/03/session-cookie-expiration-time-in-rails/
現在,我的 CookieStore 會話將在兩周后到期,因此用戶必須再次提交其登錄憑據才能再持續登錄兩周。
基本上,它很簡單:
我會選擇 Devise 為 Rails 提供出色的身份驗證解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.