Java和Hibernate实现数据"安全性"

时间:2020-03-05 18:45:03  来源:igfitidea点击:

我当前正在使用的系统需要一些基于角色的安全性,在Java EE堆栈中可以很好地满足这一需求。该系统旨在成为业务领域专家在其之上编写代码的框架。

但是,还需要数据"安全性"。即,最终用户可以看到哪些信息。

这实际上意味着减少对数据库中行(甚至列)的可见性。

我们使用Hibernate来保持持久性。但是,我们使用自己的注释,以便不向业务领域专家公开我们的持久性选择。

对于基于行的安全性,这意味着我们可以在实体级别添加诸如@Secured之类的注释,这将导致在基础表中添加额外的列以约束我们的选择?

对于基于列的安全性,我们也许可以使用@Secured来辅助查询的生成,或者使用方面来过滤返回的信息?

我很好奇这也可能会影响hibernate的缓存机制吗?

我敢肯定,很多其他人也会遇到同样的问题,我想知道我们是如何解决这个问题的?

非常感激...

解决方案

回答

Hibernate具有可能适合过滤器机制。过滤器将重写hibernate生成的查询,以包括一个添加子句来限制返回的行。我不知道在冬眠中要遮罩/隐藏列的任何内容。

数据库可能也支持此功能。例如,Oracle具有虚拟专用数据库(VPD),它将在数据库级别重写查询。此解决方案的另一个好处是,违反数据库的任何外部程序(例如报告工具)都将强制执行安全性限制。 VPD还支持使用NULL屏蔽受限制的列。

不幸的是,上述解决方案不足以满足我通常从事的项目类型的安全要求。在以上解决方案中,通常存在某种上下文无法轻松表达的情况。例如,用户可以查看自己创建的数据或者已被标记为公开的数据,或者属于他们管理的项目的数据。

我们通常创建查询/查找器/ DAO对象,在其中传递加强安全性所需的值,然后相应地创建查询。

我希望这有帮助

回答

使用Hibernate过滤器时,我们需要注意,添加限制将不会应用于由load()或者get()方法生成的SQL语句。