如何从子域到另一个子域共享会话?

时间:2012-12-04 00:19:21

标签: ruby-on-rails cookies ruby-on-rails-3.2 session-cookies

我有一个指向secure.example.com的登录表单,它会初始化会话,然后重定向到www.example.com

重定向时,不会创建会话。返回secure.example.com,然后创建会话。这是否是我认为cookie如何工作的限制?

当然我在session_store中添加了域:: all,结果相同。

我正在使用Ruby on Rails 3.2

3 个答案:

答案 0 :(得分:1)

我的配置很好,因为我配置了domain: :all,这就是所需要的。

我的问题是我必须在我的所有Cookie中定义domain: :all,如下所示:

cookies[:new_cookie] = { :value => "value", domain: :all }

删除时:

cookies.delete :new_cookie, domain: :all

在此更改之后,一切都按预期工作。

答案 1 :(得分:0)

只要您拥有example.com并正确定义您的cookie域,您就应该没问题。这里有一个非常好的答案(或者,正如作者所说,浏览器实际上如何实现它们):How do browser cookie domains work?

在rails中,只需在设置cookie时传递:domain的正确值。

答案 2 :(得分:0)

您可以在两个应用中设置相同的session_key。在appA environment.rb中更改session_key,就像这样

Rails::Initializer.run do |config|
  ...  
   config.action_controller.session = {
   :session_key => '_portal_session',
   :secret      => '72bf006c18d459acf51836d2aea01e0afd0388f860fe4b07a9a57dedd25c631749ba9b65083a85af38bd539cc810e81f559e76d6426c5e77b6064f42e14f7415'
   }
   ...
   end

在AppB中执行相同的操作。 (记得使用相同的秘密)

现在您有共享会话。假设你使用restfull_authentication,它设置一个名为user_id的会话变量。在appA中进行身份验证时,会在会话中设置user_id。现在,在appB中,您只需要验证会话中是否存在user_id。

这是整体架构,您可以使用这个想法详细说明。

相关问题