Сохранение существующих сессий при обновлении до Rails 5.2 (с Redis Session Store) - PullRequest
0 голосов
/ 17 июня 2019

Я недавно закончил большое обновление приложения Rails.Я взял приложение постепенно от Rails 4.2.8 до Rails 5.2.3.Все прошло гладко, все наши автоматизированные тесты пройдены, и мы начали приемочное тестирование пользователей.

До сих пор единственной проблемой, которая была обнаружена, является то, что вошедшие в систему пользователи выходят из этого обновления.Ранее у нас был установлен redis-rails gem (версия 4.0.0), позволяющий использовать Redis для нашего session_store, и теперь мы используем встроенное хранилище Redis, которое поставляется с Rails 5.2.

Iнаша конфигурация настроена на использование того же соединения 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 Ответ

0 голосов
/ 18 июня 2019

Я понял это!Я думал, что параметр key для конфигурации session_store должен был установить значение ключа 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, так как хранилища сеансов не имели ключа для их идентификации ранее.

...