Как динамически изменить имя куки сессии в Rails?
У меня есть мультитенантное приложение Ruby on Rails 4.2, в котором я хочу, чтобы каждый арендатор использовал свои собственные файлы cookie сеанса и параметры cookie. Я пробовал разные подходы, но я не могу понять каждую деталь правильно.
Чтобы добавить больше контекста, клиент выбирается из URL-адреса узла в запросе в Middleware и устанавливается в переменную потока, к которой я могу получить доступ вниз по стеку. Давайте назовем этот объект настроек как Settings.current_account
,
Вариант 1: промежуточное ПО:
class AccountableSessionCookies
def initialize(app)
@app = app
end
# @param [Hash] The Rack environment.
def call(env)
dup.call!(env)
end
# @param env [Hash] The Rack environment.
def call!(env)
env['rack.session.options'][:key] = Settings.current_account.session_key
env['rack.session.options'][:expire_after] = Settings.current_account.session_expiration
@app.call(env)
end
end
а затем в инициализаторе
Rails.application.config.session_store :cookie_store, key: 'bla',
expire_after: 1_209_600
Результат: это позволит мне установить expire_after
, но не имя куки, которое останется bla
,
Вариант 2: пользовательский магазин печенья
module ActionDispatch
module Session
class AccountCookieStore < CookieStore
def initialize(app, options={})
super(app, options.merge!(key: Settings.current_account.session_key),
expire_after: Settings.current_account.session_expiration)))
end
end
end
end
а затем в инициализаторе:
Rails.application.config.session_store :account_cookie_store, key: 'bla',
expire_after: 1_209_600
Но тогда кажется, что AccountCookieStore
экземпляр загружен ДО того, как вызов попадет в промежуточное ПО, где Settings.current_account
следовательно, из запроса нельзя извлечь значения и использовать их для создания файла cookie.
Вариант 3: after_filter в ApplicationController
after_filter :short_session
def short_session
request.session_options = request.session_options.dup
request.session_options[:expire_after] = 100.days.to_i
request.session_options[:key] = 'mynewkey'
request.session_options.freeze
end
Это просто не работает.
Что мне не хватает? Любые идеи о том, как я могу это сделать?