我有一个支持多个域的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。
答案 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_session
为example1.com
,example2.com
为abcdef123
。 Cookie由浏览器管理,只有在域匹配时才会发送给主机。
假设您访问example1.com并登录,您将获得一个值为uvwxyz890
的cookie。然后您登录example2.com,您将获得另一个带有随机字符串{{1}}的cookie。
如果您稍后返回example1.com,浏览器只会将对此域有效的Cookie发送到您的应用。您的应用程序无需管理任何内容,也无需进行任何操作。