2016-09-14 71 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

相關問題