2008-08-29 54 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的过滤器。