2016-09-14 61 views
0

假设我正在运行一个多租户应用程序,该应用程序通过子域为每个组织提供自己的门户。浏览器会话是否对每个子域唯一?

示例 -

  • 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,其中我的用户名是44。如果我在orgA中设置会话后登录到orgB,是否有机会偶然以orgB上的22作为用户登录?

更重要的是,我试图了解浏览器Cookie会话是如何设置的。根据我的理解,它是在客户端浏览器中加密并缓存的变量的哈希。这是每个子域的设置吗?或者,特定站点的所有子域共享相同的缓存/会话Cookie?

更重要的是,如何防止以上例子中的会话交叉授粉?我的current_user方法是否太基础?

谢谢!

回答

1

您在这里基本上询问cookies,答案相对简单:除非您明确要求,否则Cookie是而不是在子域之间共享。

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

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

如果您在创建上siteA.example.com发送cookie的example.com一个domain选项,那么该cookie将两个example.com*.example.com访问,因此所有的网站将能够访问它。

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

+0

听起来像我在明确留下它与默认值。完美清晰的解释 - 谢谢! – user2490003

相关问题