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

18

我已经苦苦挣扎了很长时间,但一直没有找到解决方法。我需要一个用户能够在单个登录下查看多个顶级域名。

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

非常感谢您的帮助。


zenazn关于cookie的限制的回答很好。有人能提供至少一个跨子域登录的示例吗?Cookie应该支持这个功能。Rails是如何实现的? - James A. Rosen
5个回答

8

这个问题有点棘手。由于cookie只能被指定给(和从)当前域名(例如“forms.example.com”)和父级域名(“。example.com”,但不是“.com”),但不能指定给其他域名(“othersite.com”),所以你需要找到其他的解决方案。这与Rails无关,而与cookie的工作方式有关。

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

这个网站提供了一种可能的创建跨域cookie的解决方案,这是我知道的最清洁的方法,虽然它可能有一些安全隐患。更复杂的版本将使服务器通过某些安全通道直接进行通信。

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


2
在Rails 2.3中的子域名。
ActionController::Base.session = { :domain => ".mydomain.com" }

对于顶级域名,请尝试使用 这个中间件
目前我正在使用上述中间件进行测试,但它并没有像预期那样完全正常工作。如果您使用该中间件,则不需要上述代码,因为它也处理子域名。

1
如果您想要跨域进行身份验证,而无论这些域是顶级域还是子域,您可能需要类似 RubyCAS 的东西。

0

我认为你的问题不够明确。你是想要一个适用于所有Rails应用程序的单个cookie,还是在单个应用程序的上下文中使用?如果是前者,你需要查看使用基于数据库的会话解决方案或类似RubyCAS这样的东西来实现CAS协议。


0

Keltia和zuk都是正确的,答案是rubyCAS。我们已经完成了该集成,它允许:

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

SSO-单点登出 您从一个站点退出后,自动退出另一个站点

对我们来说,这是一种可靠的解决方案,而且实现起来并不难。

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

祝好, Sameera


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接