2013-05-20 93 views
1

我試圖將現有的NHibernate應用程序強制轉換爲多租戶應用程序。數據模型相當龐大(60多個實體),但這些實體只有一小部分需要保護。作爲一個額外的皺紋,數據訪問模型被用於應該忽視安全性的單獨應用程序中。NHibernate實體安全/過濾

爲此,我在安全實體上創建了表示ACL的其他實體。

我設法通過添加一個LoadCollection偵聽器來獲得看起來像安全的東西。當加載安全實體集合時,我檢查每個安全實體的ACL,並在不允許訪問的情況下將其從列表中刪除。

但是,我不知道如何加載單個實體時完成同樣的事情。我有一個PreLoad事件監聽器,我可以確定調用者是否有權訪問。如果他們沒有訪問權限,我想返回一個空項目。我試着將與事件關聯的實體設置爲null並從會話中驅逐實體。

有關使用此事件的文檔在地面上非常薄弱:大多數情況下,事件是在保存之前觸發的,這些事件都是有效的例子。 NHibernate Cookbook使用了NHibernate的一個非常舊的版本,它爲事件提供了不同的簽名(例如,它們返回布爾而不是NHibernate 3.3.x的void)。

編輯: 在通過NHibernate源代碼進行探測之後,我確定我正在查看錯誤的Load事件。我嘗試了「PreLoad」和「PostLoad」,沒有意識到簡單的舊的「Load」事件是我之後的事情。

雖然這引發了一個新問題:當加載一個不安全的對象,但有一個安全的父對象時,我的Load事件偵聽器將觸發父代的代理。無論是否加載,父代理將沒有正確的ACL:每次都會出現空白。

回答

2

使用此設計的NHibernate應用程序的一個很好的完整示例可以在 NHibernate best practices中找到,我們將它用於企業,擁有超過300個實體的沉重網絡應用程序,取得巨大成功。 除此之外,我們實現了一個上下文控制機制,每個最終用戶都在登錄時請求一個安全令牌,並在每個順序調用中使用它,在每個順序調用中,我們檢查安全令牌進行驗證並使用它創建額外標準,根據他的配置限制每個用戶的訪問權限。這是一個大項目,但它爲我們提供了良好的開發和維護基礎設施。