簡體   English   中英

在 Rails 應用程序中實現“記住我”

[英]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,它結合了用戶 ID 和隨機值
  • 當新會話開始時,檢查 id/value cookie 是否存在,如果匹配則驗證新用戶。

作者還建議在每次登錄時使隨機值無效並重置 cookie。 就我個人而言,我不喜歡這樣,因為這樣您就無法在兩台計算機上登錄站點。 我傾向於確保我的密碼更改功能也重置隨機值,從而鎖定其他機器上的會話。

最后,他給出的關於使某些功能(密碼更改/電子郵件更改等)對自動驗證會話不可用的建議非常值得遵循,但在現實世界中很少見。

我花了一段時間思考這個問題並得出了一些結論。 默認情況下,Rails 會話 cookie 是防篡改的,因此您真的不必擔心 cookie 在客戶端被修改。

這是我所做的:

  • 會話 cookie 設置為長期存在(6 個月左右)
  • 會話存儲內部
    • 設置為登錄 + 24 小時的“過期”日期
    • 用戶身份
    • Authenticated = true 這樣我就可以允許匿名用戶會話(由於 cookie 篡改保護,所以不危險)
  • 我在應用程序控制器中添加了一個 before_filter 來檢查會話的“過期”部分。

當用戶選中“記住我”框時,我只是將會話 [:expireson] 日期設置為登錄 + 2 周。 沒有人可以竊取 cookie 並永遠保持登錄狀態或偽裝成另一個用戶,因為 rails 會話 cookie 是防篡改的。

我建議您查看 RESTful_Authentication 插件,它有一個實現,或者只是將您的實現切換為使用 RESTful Authentication_plugin。 關於如何在 Railscasts 中使用這個插件有一個很好的解釋:

railscasts #67 restful_authentication

這是插件本身的鏈接

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 會話將在兩周后到期,因此用戶必須再次提交其登錄憑據才能再持續登錄兩周。

基本上,它很簡單:

  1. 在 vendor/plugins 目錄中包含一個文件
  2. 僅使用一行在應用程序控制器中設置會話到期值

我會選擇 Devise 為 Rails 提供出色的身份驗證解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM