我最近完成了一个Rails应用程序的大升级。我把应用程序从Rails 4.2.8递增到了Rails 5.2.3。一切进展顺利,我们所有的自动化测试都通过了,我们已经开始了用户接受测试。
到目前为止,唯一发现的问题是登录用户正在通过这次升级注册。我们以前安装了redis-rails gem (version 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时处理过这个问题,并成功地保留了现有的会话?
编辑:其他可能与更新相关的宝石包括ruby 2.3.4 => 2.5.5、devise 4.0.3 => 4.6.2和redis 3.2.2 => 4.1.2。
发布于 2019-06-18 16:18:17
我已经搞清楚了!我认为用于key配置的session_store参数应该设置session_store键值。此参数实际上用于用户浏览器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缓存对象无效并被错误地重命名,因为会话存储之前没有标识它们的密钥。
https://stackoverflow.com/questions/56638657
复制相似问题