设计不适用于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::SessionsController
inheritance,则可以在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,这些都会在测试之间造成混淆。
- 从视图中设置cookie,然后从Rails中的Controller读取它
- Sinatra – response.set_cookie不起作用
- Rails 4不加密cookie内容
- Rails + Cucumber / Capybara:如何在测试中设置/检索cookie?
- 在cookie名称中使用括号(Rails)
- 如何从ApplicationController(Rails)访问cookie
- 如何从websocket连接握手的头部解码cookie? (ruby)
- 使用Devise的Rails应用程序使用session_id和remember_user_token之间的区别
- Rails 4加密Cookie重播攻击