Сохранение существующих сессий при обновлении до Rails 5.2 (с Redis Session Store)
Я недавно закончил большое обновление приложения Rails. Я взял приложение постепенно от Rails 4.2.8
в Rails 5.2.3
, Все прошло гладко, все наши автоматизированные тесты пройдены, и мы начали приемочное тестирование.
Пока единственная проблема, которая была обнаружена, состоит в том, что зарегистрированные пользователи выходят из этого обновления. Мы ранее имели redis-rails
драгоценный камень (версия 4.0.0
) установлен, чтобы включить использование Redis для нашего session_store
и теперь мы используем встроенный магазин Redis, который поставляется с Rails 5.2
,
Моя конфигурация настроена на использование того же подключения 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
1 ответ
Я понял это! Я думал, что key
параметр для session_store
config должен был установить значение ключа Redis. Этот параметр фактически используется для ключа 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, так как хранилища сеансов не имели ключа для их идентификации ранее.