【问题标题】:Keeping Existing Sessions When Upgrading to Rails 5.2 (with Redis Session Store)升级到 Rails 5.2 时保留现有会话(使用 Redis 会话存储)
【发布时间】:2019-10-31 11:32:39
【问题描述】:

我最近完成了一个 Rails 应用程序的大升级。我将应用程序从Rails 4.2.8 逐渐增加到Rails 5.2.3。一切都很顺利,我们所有的自动化测试都通过了,我们已经开始了用户验收测试。

到目前为止,唯一发现的问题是已登录的用户正在被此升级注销。我们之前安装了redis-rails gem(版本4.0.0),以便为我们的session_store 使用Redis,现在我们使用Rails 5.2 附带的内置Redis 存储。

我将我们的配置设置为使用与以前相同的 Redis 连接和相同的 session_store 键值,但我无法弄清楚为什么会话仍在被重置。似乎 redis-rails 4.0.0 没有正确设置 session_store 键值?

redis-rails 升级到Rails 5.2 时,有其他人处理过这个问题并成功保留了现有会话吗?

编辑: 已更新的其他可能相关的 gem 包括 ruby 2.3.4 => 2.5.5devise 4.0.3 => 4.6.2redis 3.2.2 => 4.1.2

【问题讨论】:

    标签: ruby-on-rails session ruby-on-rails-5.2 session-store redis-rails


    【解决方案1】:

    我想通了!我认为session_store 配置的key 参数应该设置Redis Key 值。这个参数实际上是用于用户浏览器的cookie key。我所做的升级确实为会话存储值添加了一个新的 Redis 键,但看起来没有任何参数可以更改或删除这个新的 Redis 键。

    我的解决方案是使用脚本重命名我的所有 Redis 会话键以匹配新格式(我使用“命名空间”作为 Redis 缓存存储命名空间):

    redis-cli --scan --pattern "namespace:*"  | \
    awk '/^/ {new_key=$1;gsub(/namespace:/,"namespace:_session_id:", new_key); printf "*3\r\n$6\r\nrename\r\n$" length($1) "\r\n" $1 "\r\n$" length(new_key) "\r\n"  new_key "\r\n";}'  | \
    redis-cli --pipe
    

    最后的相关配置是:

    config.cache_store = :redis_cache_store, { url: ENV['REDIS_URL'], namespace: 'namespace' }
    config.session_store :cache_store, key: '_mysite_session'
    

    这样做的缺点是它还会使所有其他 Redis 缓存对象无效并错误地重命名,因为会话存储之前没有识别它们的键。

    【讨论】:

      猜你喜欢
      • 2021-05-22
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 2012-08-10
      • 2012-04-28
      • 2016-05-23
      相关资源
      最近更新 更多