2010-11-18 48 views
1

我使用Postgresql作爲我的數據庫,並使用rails 3作爲多租戶應用程序的中間件。攔截ActiveRecord establish_connection初始化過程

我想爲每個通過establish_connection方法創建的連接設置一個包含當前登錄客戶端ID的環境變量。

有無論如何我可以通過任何回調的establish_connection攔截初始化過程來設置這個環境變量?

+0

你能描述一下你真正想達到的目標嗎?如果一個應用程序連接到許多不同的數據庫,那麼你想在env變量中設置什麼?你爲什麼要設置變量? – 2010-11-18 17:08:33

+0

對不起,在我的郵箱中沒有收到您的評論。是的,我認爲設置環境變量是一個不好的做法。基本上我爲每個客戶帳戶構建postgres模式以確保數據隱私。但是,這意味着我需要根據當前用戶的client_id更改每個ActiveRecord連接的schema_search_path。通常情況下,我不想在Model中使用會話信息,但在這種情況下,每次建立連接時都需要使用此信息。有沒有一種乾淨的方式來做到這一點? – 2010-11-29 04:17:16

回答

1

我會傾向於通過類似authority_level字段的方式來分離應用程序級別的數據。然後,您可以將「verify_permission(current_user)」方法作爲before_filter運行。

我們通常會這樣做,並有一個「kick_user_out」方法,用於在發生特權升級時自動強制註銷並通過電子郵件發送管理員警告和非敏感參數,以提醒管理員。你得到足夠的這些,帳戶也被鎖定。

+0

感謝您的回答。我仍然感覺在db級別分離客戶端數據更加舒適。保持它在客戶端級別意味着我的每個查詢都需要有一個client_id過濾器。任何惡意查詢都可能會危及安全。我更擔心這樣的流氓查詢,然後是權限級別問題。 – 2010-12-22 04:18:44