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

我一直在努力解决这个问题已经有一段时间了,并且无法找到解决方案。 我需要用户能够通过一次登录查看多个顶级域名。

我的理解是,这需要在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]提取值时,这似乎不起作用。

任何帮助是极大的赞赏。

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

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

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

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

对于Rails 2.3中的子域

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

对于顶级域名,请尝试使用此中间件 。

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

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

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

Keltia和zuk都是对的,答案是rubyCAS,我们已经做了这种整合,它允许

SSI – 单点登录-in您签到一个站点,您将自动签名到另一个站点

SSO – 单点退出您从一个站点注销并自动从另一个站点注销

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

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

欢呼声,萨内拉