升级到 Rails 5.2 时保留现有会话(使用 Redis 会话存储)

Keeping Existing Sessions When Upgrading to Rails 5.2 (with Redis Session Store)

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

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

我将我们的配置设置为使用与以前相同的 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

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

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

redis-cli --scan --pattern "namespace:*"  | \
awk '/^/ {new_key=;gsub(/namespace:/,"namespace:_session_id:", new_key); printf "*3\r\n\r\nrename\r\n$" length() "\r\n"  "\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 缓存对象无效并错误地重命名,因为会话存储之前没有密钥来识别它们。