我已经看到很多关于这个主题的问题,但是很多问题都有相互矛盾的信息,并且由于某些原因它对我没有用。
我有:
顶级域名:即lvh.me(开发)。 每个用户都有子域名:即userdomain.lvh.me 登录表单位于顶级域名:lvh.me
我想:
我试过
在初始化程序中设置以下内容:
MyApplication :: Application.config.session_store:cookie_store,:key => '_mykey',: domain => :所有的
发生了什么事?
我可以登录lvh.me:3000,我被正确地重定向到lvh.me:3000/internalpage,如果我去subdomain.lvh.me:3000就可以了。我也可以从lvh.me:3000/internalpage 但退出,如果我尝试从subdomain.lvh.me:3000注销它不起作用。
中,Devise会话控制器中的销毁操作已执行,但会话仍然存在。根据http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/,
这里的诀窍是:domain选项。这样做是设定水平 TLD(顶级域名)并告诉Rails域名有多长。 您要注意的部分是,如果您设置:domain => :所有人都喜欢在某些地方推荐,除非是这样,否则就行不通 你正在使用localhost。 :所有默认值都是TLD长度为1 意味着如果您使用Pow(myapp.dev)进行测试,它也无法正常工作 因为这是一个长度为2的TLD。
因此,在阅读之后我也尝试了
MyApplication :: Application.config.session_store:cookie_store,:key => '_mykey',: domain => 'lvh.me'
发生了什么事? 我可以登录lvh.me:3000,我正确地重定向到lvh.me:3000/internalpage,如果我去subdomain.lvh.me:3000它不起作用,我没有会话。如果我回到lvh.me:3000/internalpage我的会话已经消失了。那里发生了什么?
还有什么?
然后,在阅读rails 3.2 subdomains and devise后,我将初始化程序行更改为
MyApplication::Application.config.session_store :cookie_store, :key => '_mykey', :domain => '.lvh.me'
注意“。”在域名之前。 根据SO的帖子:
这允许在子域和域之间访问此cookie 应用程序应该跨子域维护它的会话。未必 100%你正在寻找,但它应该让你走在正确的位置 方向。
发生了什么事? 没什么,它没用。与我尝试的最后一件事相比,行为相同。
我终于尝试了What does Rails 3 session_store domain :all really do?,创建了一个自定义类来处理cookie。但我没有运气。
当然,我在每次尝试之前删除了所有的cookie和临时文件。我也更改了cookie的名称。 有帮助吗?谢谢!
答案 0 :(得分:10)
据此人说:Rails: how can I share permanent cookies across multiple subdomains?您需要手动设置域吗?谷歌搜索它看起来像'.domainname.com'
,开头的点真的是要走的路。
如果您从Devise::SessionsController
继承,则可以在创建
class SessionsController < Devise::SessionsController
def create
# modify the cookie here
super
end
end
我正在设置一个工作示例来测试它,我会在事后回复,欢呼!
忘记在create上使用令牌进行回火。问题是,你需要将令牌域设置为'.lvh.me',它就是它的所有内容,但是 domain: '.lvh.me'
只是没有做任何事情。这是我的概念证明,最终归结为控制器内部的一次变化:
class HomeController < ApplicationController
def index
cookies[:_cookietest_session] = {domain: '.lvh.me'}
end
end
在Chrome中,令牌看起来像这样
对于subdomain.lvh.me,lvh.me以及我尝试过的任何其他子域名。我可以从任何地方sign_in / sign_out,并相应地创建/销毁会话。
现在我不建议按照我的方式去做,我喜欢中间件方法我认为如果设置正确可以正常工作。如果您需要进一步的帮助,请告诉我。
干杯!
我回去试了domain: :all
,因为它确实应该像你预期的那样工作。如果我访问lvh.me,我会得到一个带有.lvh.me的cookie,但如果我得到了subdomain.lvh.me,我会得到一个读取.subdomain.lvh.me
答案 1 :(得分:0)
我认为问题是:所有人都添加了。到subdomain.lvh.me所以你会继续使用foo.subdomain.lvh.me登录,这对你没什么用。
:如果您的原始登录来自根域lvh.me然后重定向到子域,则所有似乎都有效。但你不能通过设置那样的子域名登录。
MyApplication::Application.config.session_store :cookie_store, :key => '_mykey', :domain => '.lvh.me'
看起来是指定此方法的正确方法。
注意: