2016-02-10 47 views
1

我目前已經實現了一個行級別的安全性,其中需要安全的表具有所有者,組和Unix樣式權限的列。動態禁用hibernate抓取

什麼正在發生的事情是,每次我們要求通過Hibernate的實體的時候,我們添加了一個自定義的標準驗證用戶是否有訪問數據。這個自定義標準也被添加到每個create.Alias()以確保與其他表的聯繫也得到保證。

的問題是我們的模型具有@ManyToOne關係的多個實體和因爲這些實體被自動獲取,也沒有辦法,以確保嵌套實體。

我所尋找的是一個方法要麼:

  1. 讓這個只有實體添加通過create.Alias()是獲取

    OR

  2. 增益動態控制什麼通過休眠獲取

這些似乎是不會暗示巨大代碼重構的兩種方式 我們的項目。

這是不是可以做或有任何其他方式來執行在我們的安全?

P.S:永遠不會返回嵌套實體,因爲它是客戶端所需要的。此外,我們嘗試使用max_fetch_depth 0,但即使嵌套實體在我們的初始查詢中未被請求,hibernate似乎會使多個後續查詢來完成實體。

回答

1

我在基本上這個研究的但不使用的舞臺,我自己的項目,我相信filters是你想要什麼。如果我正確理解文檔,您可以定義一個過濾器以及您的模式,啓用它並在打開會話時以編程方式給出參數,並且在會話持續期間,Hibernate會假裝沒有通過過濾器的對象不存在。除了保護基於關係的提取之外,這還將消除手動將安全檢查添加到每個查詢的需要。

+0

謝謝你的回答。我們確實研究過濾器,不幸的是,它似乎需要爲每個當前關係和未來的關係添加一個這樣的過濾器。這意味着如果未來的程序員添加了其他幾個模型並忘記包含過濾器,則該實體將不安全。這似乎有點冒險。目前我們對數據庫的請求幾乎全部重新組合到一個通用的「服務」類中,因此在每個查詢中添加安全性都不是問題。 – jemag

+0

我不會說謊,我真的沒有想到這種情況,我認爲休眠過濾器可能是一個臨時解決方案。但問題是,我似乎無法使用ManyToOne嵌套實體屬性​​來過濾實體。如果你碰巧在你自己的項目中找到了解決方法,這裏是另一個關於這個問題的stackoverflow帖子:http://stackoverflow.com/questions/35437164/hibernate-manytoone-filter-on-base-entity – jemag

+0

@jemag我正在處理它。過濾器越來越引起我的興趣,因爲這是一個真正值得更多的想法的半劈分實現。它們的應用範圍和可用屬性的範圍都非常有限,無法過濾。 – Douglas