将会话从cookie_store迁移到Rails 3中的Redis

时间:2015-04-14 13:56:02

标签: ruby-on-rails ruby-on-rails-3 session redis

我需要将我的Rails 3应用中的会话存储从 cookie_store 切换到redis-session-store。这有很多原因(安全性,SSO与其他Rails和非Rails应用程序)。是否有关于如何做的最佳实践而不会失去所有当前会话

我能想象的是两步法:

  1. 收集N天的所有用户会话并将其存储在数据库或Redis中(如果已存储则更新)。
  2. 使用存储的用户会话在Redis中创建条目。
  3. 或者,也可以实时迁移。表示读取cookie,使用密钥解密会话数据并将其作为新会话存储在Redis中。

2 个答案:

答案 0 :(得分:0)

我知道这张票已经很旧了,但这可能会对其他人有所帮助。我们最终将会话存储区更改为Redis,但随后仍在寻找旧Cookie(一两个星期),然后不再尊重它们。

在使用此策略之前,可能需要考虑一些安全问题-与必须一次注销整个用户库的成本相比,您要确保这些风险值得承担。使用Rails,Cookie被加密并且不能被篡改。

这是我们使用的:

class SessionsController < Devise::SessionsController
  LEGACY_COOKIE_NAME = "_old_session_name".freeze

  def new
    return if detect_valid_cookie

    super
  end

  private

  def detect_valid_legacy_cookie
    legacy_cookie = request.cookie_jar.encrypted[LEGACY_COOKIE_NAME].presence || {}
    valid_user_id = legacy_cookie['warden.user.user.key'].try(:first).try(:first)
    return unless valid_user_id

    user = User.find_by(:id => valid_user_id)
    return unless user

    if sign_in user
      request.cookie_jar.delete(LEGACY_COOKIE_NAME)
      redirect_to root_path # or whever you want
      true
    else
      false
    end
  end
end

答案 1 :(得分:-1)

从这里被盗:

http://www.happybearsoftware.com/almost-protect-yourself-from-cookie-session-store.html(最后两节)

基本上,请使用:

Rails.application.config.action_dispatch.cookies_serializer = :hybrid

引用如下:

  

这将导致Rails接受与Marshal序列化的会话,并将它们交换为使用JSON序列化的会话。

     

在确信所有用户会话都已转换为JSON后,您可以推出另一个将配置值翻转为:json的版本。

     

注意:如果您在会话中存储复杂的Ruby对象并需要使用Marshal进行序列化,那么您将无法使用JSON序列化程序。