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]

任何帮助是极大的赞赏。

4

5 回答 5

8

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

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

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

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

于 2008-12-18T14:51:12.023 回答
2

对于 Rails 2.3 中的子域

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

对于顶级域,试试这个中间件

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

于 2010-05-23T12:19:21.980 回答
1

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

于 2008-12-23T17:37:19.747 回答
0

恕我直言,您的问题不够精确。您想要为您拥有的所有 Rails 应用程序提供一个 cookie,还是在单个 cookie 的上下文中?如果是前者,您想查看使用数据库支持的会话或类似RubyCAS的东西来实现CAS协议的解决方案。

于 2008-12-18T14:35:52.087 回答
0

Keltia 和 zuk 都是对的,答案是 ruby​​CAS,我们已经进行了集成,它允许

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

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

对我们来说,这是一个行之有效的解决方案,并不难实施

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

干杯,萨梅拉

于 2009-11-30T20:07:13.243 回答