2008-08-29 51 views
6

我目前正在使用的系統需要一些基於角色的安全性,這在Java EE堆棧中得到很好的處理。該系統打算成爲業務領域專家在其上編寫代碼的框架。java和hibernate的數據'安全性'

但是,對數據security也有要求。也就是說,最終用戶可以看到哪些信息。

這意味着降低數據庫中行(甚至列)的可見性。

我們使用Hibernate來實現持久性。然而,我們正在使用我們自己的註釋,以便不會將我們的持久選擇暴露給業務領域專家。

對於基於行的安全性,這意味着我們可以在實體級別添加註釋,例如@Secured,這會導致將額外的列添加到基礎表以約束我們的選擇?

對於基於列的安全性,我們可能有@Secured可以幫助查詢生成,或者可能使用某個方面來過濾返回的信息?

我很想知道這可能會如何影響hibernate的緩存機制?

我相信很多其他人會遇到同樣的問題,我想知道你是如何處理這個問題的?

非常感謝......

回答

6

Hibernate有一個filter mechanism可能爲你工作。過濾器將重寫hibernate生成的查詢以包含附加子句以限制返回的行。我不知道有什麼在休眠掩蓋/隱藏列。

您的數據庫可能也支持此功能。例如,Oracle有Virtual Private Database(VPD),它將在數據庫級重寫您的查詢。該解決方案還有一個額外的好處,即任何違背您的數據庫的外部程序(例如報告工具)都會強制執行您的安全限制。 VPD也支持用NULL來掩蓋受限制的列。

不幸的是,上述解決方案不足以支持我通常使用的類型項目的安全性要求。在上述解決方案中,通常存在某種不容易表達的背景。例如,用戶可以查看他們創建的數據,或已被標記爲公開的數據,或屬於他們管理的項目的數據。

我們通常會創建查詢/查找程序/ DAO對象,並在其中傳遞強制執行安全性所需的值,然後相應地創建查詢。

我希望這有助於

1

使用時需要注意的是,附加的限制將不會被應用到由load()get()方法generted SQL語句Hibernate的過濾器。