我有一个支持多个域的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。
你应该这样做:
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'
即您的域应以点开头。
这应该不是问题,因为 cookie 仅对每个域有效。您可以有一个_MyApp_session
用于example1.com
,一个用于example2.com
。Cookie 由浏览器管理,并且仅在域匹配时才发送到主机。
假设您访问 example1.com 并登录,您将获得一个值为 abcdef123
的 cookie 。然后你登录 example2.com,你会得到另一个带有随机字符串的cookie uvwxyz890
。
如果您稍后返回到 example1.com,浏览器将仅将对此域有效的 Cookie 发送到您的应用。您的应用程序不必管理任何东西,也不必破解任何东西。