我試圖將現有的NHibernate應用程序強制轉換爲多租戶應用程序。數據模型相當龐大(60多個實體),但這些實體只有一小部分需要保護。作爲一個額外的皺紋,數據訪問模型被用於應該忽視安全性的單獨應用程序中。NHibernate實體安全/過濾
爲此,我在安全實體上創建了表示ACL的其他實體。
我設法通過添加一個LoadCollection偵聽器來獲得看起來像安全的東西。當加載安全實體集合時,我檢查每個安全實體的ACL,並在不允許訪問的情況下將其從列表中刪除。
但是,我不知道如何加載單個實體時完成同樣的事情。我有一個PreLoad事件監聽器,我可以確定調用者是否有權訪問。如果他們沒有訪問權限,我想返回一個空項目。我試着將與事件關聯的實體設置爲null並從會話中驅逐實體。
有關使用此事件的文檔在地面上非常薄弱:大多數情況下,事件是在保存之前觸發的,這些事件都是有效的例子。 NHibernate Cookbook使用了NHibernate的一個非常舊的版本,它爲事件提供了不同的簽名(例如,它們返回布爾而不是NHibernate 3.3.x的void)。
編輯: 在通過NHibernate源代碼進行探測之後,我確定我正在查看錯誤的Load事件。我嘗試了「PreLoad」和「PostLoad」,沒有意識到簡單的舊的「Load」事件是我之後的事情。
雖然這引發了一個新問題:當加載一個不安全的對象,但有一個安全的父對象時,我的Load事件偵聽器將觸發父代的代理。無論是否加載,父代理將沒有正確的ACL:每次都會出現空白。