Сохранение существующих сессий при обновлении до 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, так как хранилища сеансов не имели ключа для их идентификации ранее.

Другие вопросы по тегам