如何在Rails中动态更改会话cookie名称?

时间:2018-09-18 18:14:11

标签: ruby-on-rails ruby-on-rails-4 cookies multi-tenant rack-middleware

我有一个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

这是行不通的。

我想念什么?关于如何完成此工作的任何想法?

0 个答案:

没有答案