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

Ton*_*ony 9 ruby cookies devise ruby-on-rails-3

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

我有:

顶级域名:即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 =>:在某些地方建议使用所有类似的东西,除非你使用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'
Run Code Online (Sandbox Code Playgroud)

注意"." 在域名之前.根据SO中的帖子:

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

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


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

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

Hug*_*ugo 10

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

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

class SessionsController < Devise::SessionsController
  def create
    # modify the cookie here
    super
  end
end
Run Code Online (Sandbox Code Playgroud)

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

这是我的编辑

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

class HomeController < ApplicationController
  def index
    cookies[:_cookietest_session] = {domain: '.lvh.me'}
  end
end
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

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

干杯!

好的最后一件事

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

在此输入图像描述