我有一个Ruby on Rails 4.2多租户应用程序,我希望每个租户都使用它自己的会话cookie和cookie选项。我尝试了不同的方法,但无法获得所有详细信息。
要添加更多上下文,请在中间件中从请求的主机URL中选择租户,并将其设置为线程变量,以便我可以访问堆栈。让我们将该设置对象称为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
,而不是cookie名称,而将其保留为bla
。
选项2:自定义Cookie存储
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:ApplicationController中的after_filter
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
这是行不通的。
我想念什么?关于如何完成此工作的任何想法?