0

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

到目前为止,唯一发现的问题是登录用户正在被此升级注销。我们之前安装了redis-railsgem(版本4.0.0)以启用 Redis session_store,现在我们正在使用Rails 5.2.

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

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

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

4

1 回答 1

3

我已经想通了!我认为配置的key参数session_store应该是设置 Redis Key 值。该参数实际上是用于用户浏览器的 cookie 键。我所做的升级确实为会话存储值添加了一个新的 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 缓存对象无效并错误地重命名,因为会话存储之前没有识别它们的密钥。

于 2019-06-18T16:18:17.950 回答