如何在Rails 3中实现"记住我"功能?

Mis*_*hko 2 authentication ruby-on-rails remember-me ruby-on-rails-3

在Rails 3应用程序中实现"记住我"功能的最佳实践是什么?

我在用户登录时将会话信息(会话ID +用户ID)存储在数据库中,此时我不想使用任何插件.

任何指针或代码示例将非常感激.

小智 8

您只需在已签名的Cookie上设置过期即可完成此操作.(签名的cookie就像Rails提供的sessioncookie 一样是防篡改的.)

class SessionsController < ApplicationController

  def create
    ...
    user = User.authenticate(params[:email_address], params[:password])

    if params[:remember_me]
      cookies.signed[:user_id] = { value: user.id, expires: 2.weeks.from_now }
    else
      # expires at the end of the browser session
      cookies.signed[:user_id] = user.id
    end
  end

  def destroy
    cookies.delete :user_id
  end
end 

class ApplicationController < ActionController::Base
  ...
  def current_user
    User.find(cookies.signed[:user_id])
  end     
end
Run Code Online (Sandbox Code Playgroud)

  • 将 user_id 存储在签名 cookie 中存在安全问题。SignedCookieJar 仅对 cookie 的内容进行签名,而不对名称进行签名。这意味着,如果您拥有签名的 Cookie first_name 和 user_id,则有人可以复制 Cookie First_name 的值并将其放入 user_id 中,服务器将接受它。如果您的用户输入了签名的 cookie,那么您就会面临风险。 (2认同)