Смена ключа Rails session_store - PullRequest
0 голосов
/ 31 января 2020

Мне нужно сохранить пользовательские сеансы даже после того, как я внедрил изменение в ключе session_store:

Перед развертыванием:

MyApp::Application.config.session_store :active_record_store, key: '_abc_session'

После развертывания:

MyApp::Application.config.session_store :active_record_store, key: '_xyz_session'

Пользователи по-прежнему должны иметь возможность использовать старый key даже после внесения этого изменения.

Любая идея о том, как сделать старым ключ действителен даже после развертывания?

1 Ответ

2 голосов
/ 31 января 2020

Чтобы старые сеансы работали, необходимо, чтобы приложение считывало данные с обоих ключей, а записывало только новые. Этот подход использовался rails при переключении с маршализованных сессий на режим json (:hybrid)

Что-то вроде этого должно происходить (не проверялось, версия вашей стойки может отличаться, поэтому лучше придумать ваш вариант):

class MyHybridStore < ActionDispatch::Session::ActiveRecordStore
  # this lives in Rack::Session::Abstract::Persisted (this is modified from rack 2.1.2, yours may differ)
  def unpacked_cookie_data(request)
    request.fetch_header(RACK_SESSION_UNPACKED_COOKIE_DATA) do |k|
      # the trick:
      session_data = request.cookies[@key].presence || request.cookies['_abc_session']

      if @secrets.size > 0 && session_data
        session_data, _, digest = session_data.rpartition('--')
        session_data = nil unless digest_match?(session_data, digest)
      end

      request.set_header(k, coder.decode(session_data) || {})
    end
  end
end

MyApp::Application.config.session_store MyHybridStore, key: '_xyz_session'
...