Rails - 多个***域和单个会话/cookie

Posted

技术标签:

【中文标题】Rails - 多个***域和单个会话/cookie【英文标题】:Rails - Multiple top level domains and a single session/cookie 【发布时间】:2010-09-27 11:43:27 【问题描述】:

我已经为此苦苦挣扎了很长一段时间,但一直无法 找到解决办法。我需要一个用户能够查看多个*** 单次登录的域。

我的理解是这个需要设置在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 限制的回应是一个很好的回应。至少有人可以提供跨子域一次登录的示例吗? Cookies 应该支持这一点。 Rails 怎么样? 【参考方案1】:

对于 Rails 2.3 中的子域

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

对于***域,请尝试this middleware。

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

【讨论】:

【参考方案2】:

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

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

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

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

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

干杯, 萨梅拉

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于Rails - 多个***域和单个会话/cookie的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 3 中跨多个子域删除会话 Cookie

在 Rails 中的子域之间共享会话(cookie)?

如何手动解密 Rails 5 会话 cookie?

Rails 3 从单个模型和方法创建多个记录条目

Rails 3 禁用会话 cookie

ruby 在Rails 3中解码会话Cookie