2011-04-19 79 views
8

我目前正在評估認證/授權框架。如何在Java中實現行級安全性?

Apache Shiro似乎很好,但我缺少行級安全功能。

E.g.數據庫中可能有特殊的行,應該只有特殊權限的用戶才能看到和訪問。 爲了避免不必要的往返行爲,我們目前修改SQL查詢以加入我們的授權數據,以僅獲取當前用戶的可見行。

但是這個概念對我來說並不「正確」,因爲我們將業務代碼與安全相關的代碼混合在一起,這應該是相互正交和獨立的。

  • 有什麼解決方案可用?
  • 如何實現行級安全(特別是與jpa結合使用)

UPDATE:

目標的數據庫主要是Oracle 10g中/11克
- 但如果沒有大的缺點

+0

什麼是您的目標數據庫? – 2011-04-19 12:29:57

回答

7

行級安全確實是最好的數據庫獨立的解決方案將是首選在數據庫本身完成。當你獲取連接時,數據庫必須被告知你的用戶上下文是什麼。該用戶與一個或多個安全組相關聯。數據庫然後自動將過濾器附加到用戶提供的查詢中,以過濾出安全組無法看到的內容。這當然意味着這是每個數據庫類型的解決方案。

Oracle具有相當不錯的行級安全支持,請參閱http://www.orafusion.com/art_fgac.htm作爲示例。

0

有一個有用的文章:http://mattfleming.com/node/243

的想法是,你可以通過兩種方式實現行級功能:直接設置在你的倉庫限制或通過結合AOP的限制。後者是首選,因爲安全層應與業務邏輯分開(正交關注)。

在Hibernate中,您可以使用透明應用的過濾器的概念,並且存儲庫不知道它們。您可以通過AOP添加這樣的過濾器。另一種方法是攔截session.createCriteria()並使用AOP透明地向Criteria添加限制。

2

我們將它實現爲JDBC包裝器。 這個包裝只是解析和轉換SQL。 Hibernate過濾器也是個好主意,但我們有許多報告和即席查詢,Hibernate並不是我們應用程序中訪問數據的唯一工具。 jsqlparser是一款出色的開源SQL解析器,但我們必須通過分析它來解決一些問題並添加對某些高級SQL功能的支持,例如用於報告目的的ROLLUP https://github.com/jbaliuka/sql-analytic 此報告工具也可用於github,但不存在對行級別安全基礎架構的依賴性https://github.com/jbaliuka/x4j-analytic

+0

你開源了你的jdbc包裝嗎?在我看來,像「行級安全jdbc包裝器」將是這裏最好的解決方案。我已經嘗試jpasecurity看起來像一個很大的努力,但它遵守JPA規範是可疑的。 – 2014-05-19 19:10:14

+0

我改進了這個庫來支持類似於postgres的策略,它是一個新的代碼,而不是我的內部東西來報告,但這個新的代碼應該更有用,因爲它也支持DML。我不確定是否有時間維護它,因爲所有主要數據庫已經在內部支持RLS(Postgres,Oracle,MS SQL Server) – jbaliuka 2016-04-12 08:53:48