Rails - 多个顶级域和单个会话/ cookie

时间:2008-12-18 07:48:33

标签: ruby-on-rails ruby session dns

我一直在努力解决这个问题已经有一段时间了,但却无法做到 找到解决方案。我需要一个用户才能查看多个顶级 只有一次登录的域名。

我的理解是,这需要在environment.rb中设置 使用before_dispatch调用。这就是我想出来的:

require 'activesupport'
require 'dispatcher'
module ActionController
   class Dispatcher

      def set_session_domain
         ActionController::Base.session_options.update :session_domain => "#{@request.host}"
      end 

      before_dispatch :set_session_domain
   end
end

但是,当我尝试拉取值时,这似乎不起作用 来自session[:session_domain]

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:8)

这个有点棘手。由于cookie只能分配给(并从中检索)当前域(例如“forms.example.com”)和父域(“.example.com”,但不是“.com”),但不能分配给其他域(“othersite.com”),你必须找到另一种解决方案。这与Rails无关,但与cookies有关。

编辑:会话依赖于存储在cookie中的特定于客户端的句柄,这就是会话也不能跨域工作的原因。

This site有一个可能的解决方案来创建跨域cookie,这是我所知道的最干净的方式,尽管它可能有一些安全隐患。更复杂的版本会让服务器直接通过某个安全通道进行通信。

如果您正在寻找更通用的单一登录服务,请尝试实施某种形式的OpenID

答案 1 :(得分:2)

对于Rails 2.3中的子域

ActionController::Base.session = { :domain => ".mydomain.com" }

对于顶级域名,请尝试this middleware

我此刻一直在使用上述中间件,但它并没有按预期工作。如果您使用中间件,则不需要上面的代码,因为它也处理子域。

答案 2 :(得分:1)

如果您希望跨域进行身份验证,无论它们是顶级域还是子域,您可能都需要像RubyCAS这样的东西。

答案 3 :(得分:0)

你的问题不够精确恕我直言。您是否想要一个cookie用于您拥有的所有Rails应用程序,或者它是否在单个环境中?如果是前者,您希望使用数据库支持的会话或RubyCAS行的某些内容来查看解决方案,以实现CAS协议。

答案 4 :(得分:0)

Keltia和zuk都是对的,答案是rubyCAS,我们已经进行了整合并允许

SSI - 单点登录-in 您签到一个站点,然后您自动登录到另一个站点

SSO - 单点注销 您从一个站点注销并自动从另一个站点注销

对我们来说,这是一个经过验证的解决方案,而不是一个难以实施的解决方案

我们正在使用它 http://www.cabslk.com和www.ticketslk.com

欢呼声, Sameera