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

时间:2013-02-08 19:46:00

标签: ruby ruby-on-rails-3 cookies devise

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

我有:

顶级域名:即lvh.me(开发)。 每个用户都有子域名:即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 => :所有的

发生了什么事?

我可以登录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的名称。 有帮助吗?谢谢!

2 个答案:

答案 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中,令牌看起来像这样

enter image description here

对于subdomain.lvh.me,lvh.me以及我尝试过的任何其他子域名。我可以从任何地方sign_in / sign_out,并相应地创建/销毁会话。

现在我不建议按照我的方式去做,我喜欢中间件方法我认为如果设置正确可以正常工作。如果您需要进一步的帮助,请告诉我。

干杯!

好的,最后一件事

我回去试了domain: :all,因为它确实应该像你预期的那样工作。如果我访问lvh.me,我会得到一个带有.lvh.me的cookie,但如果我得到了subdomain.lvh.me,我会得到一个读取.subdomain.lvh.me

enter image description here

答案 1 :(得分:0)

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

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

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

看起来是指定此方法的正确方法。

注意:

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