9

我已经看到很多关于这个主题的问题,但其中很多都有相互矛盾的信息,并且由于某种原因它对我不起作用。

我有:

顶级域:即 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 => :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/

这里的诀窍是 :domain 选项。它的作用是设置 TLD(顶级域)的级别并告诉 Rails 域的长度。您要在这里注意的部分是,如果您设置 :domain => :all like 在某些地方是推荐的,除非您使用 localhost,否则它根本不起作用。:all 默认的 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 并设计之后,我将初始化程序行更改为

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

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

这允许跨子域访问此 cookie,并且应用程序应跨子域维护它的会话。可能不是 100% 您正在寻找的东西,但它应该让您朝着正确的方向前进。

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


我终于尝试了 Rails 3 session_store domain :all 真的做什么? ,创建一个自定义类来处理 cookie。但我没有运气。

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

4

2 回答 2

10

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

如果您继承自Devise::SessionsController您可以在创建时手动设置它

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

我正在设置一个工作示例来测试它,我会在之后发回,干杯!

这是我的编辑

忘记在创建时使用令牌进行回火。问题在于,您需要将令牌域设置为“.lvh.me”,这就是它的全部内容, domain: '.lvh.me'什么也不做。这是我的概念证明,最终归结为控制器内部的单个更改:

class HomeController < ApplicationController
  def index
    cookies[:_cookietest_session] = {domain: '.lvh.me'}
  end
end

在 Chrome 中,令牌看起来像这样

在此处输入图像描述

对于 subdomain.lvh.me、lvh.me 和我尝试过的任何其他子域。我可以从任何地方登录/签出,并相应地创建/销毁会话。

现在我不建议按照我的方式进行操作,我喜欢中间件方法,我认为如果设置正确,它会工作得很好。如果您需要进一步的帮助,请告诉我。

干杯!

好的最后一件事

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

在此处输入图像描述

于 2013-02-12T21:46:30.287 回答
0

我认为问题在于 :all 添加了 . 到 subdomain.lvh.me,这样您就可以使用 foo.subdomain.lvh.me 保持登录状态,这对您没有多大好处。

:all 如果您的原始登录名来自根域 lvh.me 然后您重定向到子域,则似乎可以正常工作。但是您无法通过以这种方式设置的子域登录。

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

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

笔记:

  • 确保在进行更改后重新启动 rails。
  • 确保在再次测试之前清除您的域的 cookie。您可以留下在测试之间造成混淆的剩余 cookie。
于 2015-08-25T19:17:56.593 回答