【问题标题】:Are browser sessions unique for each subdomain?每个子域的浏览器会话是否唯一?
【发布时间】:2016-09-15 01:42:12
【问题描述】:

假设我正在运行一个多租户应用程序,该应用程序通过子域为每个组织提供自己的门户。

示例 -

  • orgA.application.com
  • orgB.application.com
  • 等等……

每个子域从我的 PSQL 数据库中的不同架构/租户读取,但在其他方面是相同的应用程序。

在我的ApplicationController 中,我将current_user 设置为 -

def current_user
  if session[:user_id]
    @current_user ||= User.find_by_id(session[:user_id])
  end
end

很少有像我这样的管理员/超级用户在每个子域上都有一个用户帐户。如果我使用我的用户 (id = 22) 登录 orgA,那么我的 session 将设置为 user_id: 22

现在假设我想切换到 orgB,我的用户 ID 是 44。如果我在orgA 中设置会话后登录orgB,我是否有可能意外以orgB 上的22 用户身份登录自己?

更根本的是,我试图了解如何设置浏览器 cookie 会话。据我了解,它是在客户端浏览器中加密和缓存的变量散列。是每个子域设置的吗?或者特定站点的所有子域是否共享相同的缓存/会话 cookie?

更重要的是,如何防止上面示例中的会话异花授粉?我的current_user 方法是不是太基础了?

谢谢!

【问题讨论】:

    标签: ruby-on-rails session cookies


    【解决方案1】:

    您基本上是在这里询问 cookie,答案相对简单:cookie 在子域之间共享,除非您明确请求。

    当您发送Set-Cookie HTTP 标头以在用户浏览器中创建cookie 时,您可以选择是否包含domain 配置选项。该选项控制 cookie 保存在哪个域下并将提供给哪个域。

    默认情况下,如果您发送Set-Cookie 时没有domain 选项,则会为当前主机名设置cookie,其中包括子域。也就是说,siteA.example.com 上设置的 cookie 将无法被 siteB.example.com 访问。

    如果您在siteA.example.com 上创建cookie 时发送example.com 选项domain,那么example.com*.example.com 都可以访问该cookie,因此您的所有网站都可以访问它。

    那么,对于您的情况,您应该发送带有 no domain 选项的 Set-Cookie 标头。这是大多数设置中的默认设置,including Rails,因此您不太可能需要做任何事情。

    【讨论】:

    • 听起来我很清楚将其保留为默认值。完美而清晰的解释 - 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2015-01-09
    • 1970-01-01
    相关资源
    最近更新 更多