设计不适用于RoR3应用程序上的多个子域

我已经看到很多关于这个主题的问题,但是很多问题都有相互矛盾的信息,并且由于某些原因它对我没有用。

我有:

顶级域名:即lvh.me(开发)。 每个用户都有子域名:ie userdomain.lvh.me登录表单位于顶级域名:lvh.me

我想要:

  • 如果用户登录,则需要在所有子域之间共享会话。 我的意思是,会话需要在lvh.me:3000/something和userdomain.lvh.me:3000中激活
  • 如果用户从lvh.me:3000/something注销它应该工作,如果用户从userdomain.lvh.me:3000注销,它也应该工作。

我试过了

  • 在初始化程序中设置以下内容:

    MyApplication :: Application.config.session_store:cookie_store,:key =>’_ mykey’,:domain =>:all

发生了什么?

我可以登录lvh.me:3000,我正确地重定向到lvh.me:3000/internalpage,如果我去subdomain.lvh.me:3000它很棒。 我也可以从lvh.me:3000/internalpage注销但是如果我尝试从subdomain.lvh.me:3000注销它不起作用。 Devise SessionsController中的destroy动作被执行,但是会话并没有消失。


根据http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/ ,

这里的诀窍是:域选项。 它的作用是设置TLD(顶级域)的级别,并告诉Rails域的长度。 你要注意的部分是,如果你设置:domain =>:在某些地方建议使用all,除非你使用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子域并设计后,我将初始化器行更改为

MyApplication::Application.config.session_store :cookie_store, :key => '_mykey', :domain => '.lvh.me' 

注意“。” 在域名之前。 根据SO中的post:

这允许跨子域访问此cookie,应用程序应该跨子域维护它的会话。 可能不是100%你想要的,但它应该让你朝着正确的方向前进。

发生了什么? 没什么,它没用。 与我尝试的最后一件事相比,行为相同。


我终于尝试了Rails 3 session_store域名:一切都真的吗? ,创建一个自定义类来处理cookie。 但我没有运气。

当然,我在每次尝试之前删除了所有cookie和临时文件。 我也更改了cookie的名称。 有帮助吗? 谢谢!

根据这个人在这里: Rails:我如何在多个子域之间共享永久性cookie? 您需要手动设置域吗? 谷歌搜索它看起来像'.domainname.com'在开头的点真的是要走的路。

如果从Devise::SessionsControllerinheritance,则可以在create上手动设置它

 class SessionsController < Devise::SessionsController def create # modify the cookie here super end end 

我正在设置一个工作示例来测试它,之后我会回复,欢呼!

这是我的编辑

忘记在create上使用令牌进行回火。 问题在于,你需要将令牌域设置为'.lvh.me',这就是它的所有内容, 但是 domain: '.lvh.me'只是没有做任何事情。 这是我的概念certificate,最终归结为控制器内的一个变化:

 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的内容。

在此处输入图像描述

我认为问题在于:所有人都增加了一个。 到subdomain.lvh.me所以你会继续使用foo.subdomain.lvh.me登录,这对你没什么用。

:如果您的原始登录名是来自根域lvh.me然后重定向到子域,则所有似乎都有效。 但你不能通过设置这种方式的子域名登录。

 MyApplication::Application.config.session_store :cookie_store, :key => '_mykey', :domain => '.lvh.me' 

看起来像是指定这个的正确方法。

注意:

  • 确保在更改后重新启动rails。
  • 在再次测试之前,请确保为您的域清除Cookie。 您可以留下残留的cookie,这些都会在测试之间造成混淆。