ruby-on-rails - 在 Rails 3 中将 session 从 cookie_store 迁移到 Redis

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

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

我能想到的是两步走的方法:

  1. 收集 N 天的所有用户 session 并将它们存储在数据库或 Redis 中(如果已存储则更新)。
  2. 使用存储的用户 session 在 Redis 中创建条目。

或者,也可以进行动态迁移。意思是读取cookies,使用secret key解密session数据,作为一个新的session存储在Redis中。

最佳答案

我意识到这张票已经很旧了,但这可能会对其他人有所帮助。我们最终将 session 存储更改为 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

关于ruby-on-rails - 在 Rails 3 中将 session 从 cookie_store 迁移到 Redis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29629299/

相关文章:

web-services - Web服务认证管理

ruby-on-rails - rails : What is the use of web servers (Apache/nginx/passenger)?

javascript - 如何将环境变量嵌入到 Rails 中的 .coffee 文件中?

ruby-on-rails - 使用 Carrierwave 上传文件时没有路由匹配错误

azure - 没有可用于使用锁定 token 逻辑应用程序完成消息的 session

java - Tomcat 随机使 Session 失效

ruby-on-rails - heroku 上的自定义日志文件

ruby-on-rails - Rails 语法错误 : unexpected keyword_ensure, 期望输入结束

ruby - Rails 3 与 Sequel 集成?

ruby-on-rails-3 - 使用 Rspec 和 Factory Girl 测试 before_save 回调