首页 > 解决方案 > Rails session_store 密钥更改

问题描述

即使在 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即使进行此更改,用户仍应能够使用旧版本。

即使在部署之后,关于如何使旧密钥有效的任何想法?

标签: ruby-on-railssession-cookies

解决方案


要使旧会话正常工作,您需要使应用程序从两个键中读取,但只写入新键。:hybrid从编组会话切换到 json(模式)时,rails 使用了这种方法

这样的事情应该做(没有测试过,你的机架版本也可能不同,所以最好拿出你的变种):

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'

推荐阅读