配置Rails应用程序以处理多个子域和多个cookie

时间:2011-05-17 07:51:34

标签: ruby-on-rails ruby-on-rails-3 cookies session-cookies actiondispatch

我有一个支持多个域的rails应用程序,每个域可能有多个子域。

访问mydomain1.com的用户没有获得与mydomain2.com相同的体验(尽管应用程序的基本行为相同)

因此,如果用户登录mydomain1.com,则不应登录mydomain2.com

如果用户已登录france.mydomain1.com,则然后登录到germany.mydomain1.com

以前,我通过在会话存储配置中设置域来处理此问题:

MyApp::Application.config.session_store :cookie_store, :key => '_MyApp_session', :domain => APP_CONFIG[:domain]

我正在尝试找出处理多个域的最佳方法吗?

我已经尝试过攻击ActionDispatch::Callback但是请求无法从那里获得。

有人能建议在一个应用程序中支持多个cookie的好方法吗?

理想情况下,我想为每个子域名创建一个新的Cookie。

2 个答案:

答案 0 :(得分:5)

你应该这样做:

class ActionDispatch::Session::MultiDomainStore < ActionDispatch::Session::CookieStore
  def initialize(app, options = {})       
    super(app, options.merge!(:domain => compute_domain(app)))      
  end

  def compute_domain(app)
    ...
  end
end

MyApp::Application.config.session_store :multi_domain_store, :key => '_MyApp_session'

即。您的域名应以点开头。

答案 1 :(得分:1)

这不应该是一个问题,因为cookie仅对每个域有效。 _MyApp_sessionexample1.comexample2.comabcdef123。 Cookie由浏览器管理,只有在域匹配时才会发送给主机。

假设您访问example1.com并登录,您将获得一个值为uvwxyz890的cookie。然后您登录example2.com,您将获得另一个带有随机字符串{{1}}的cookie。

如果您稍后返回example1.com,浏览器只会将对此域有效的Cookie发送到您的应用。您的应用程序无需管理任何内容,也无需进行任何操作。