如何在Java中实现行级安全性?

| 我目前正在评估身份验证/授权框架。 Apache Shiro看起来非常不错,但是我缺少行级安全功能。 例如。数据库中可能有特殊的行,只有具有特殊特权的用户才能看到和访问这些行。 为了避免不必要的往返,我们当前修改了SQL查询以与我们的授权数据结合在一起,以仅获取当前用户的可见行。 但是这个概念对我而言并不“正确”,因为我们将业务代码与安全相关的代码混合在一起,这些代码应该正交且彼此独立。 有/可能有哪些解决方案? 如何实现行级安全性(特别是与jpa结合使用)? 更新: 目标数据库主要是Oracle 10g / 11g -但是,如果没有太大的缺点,则首选数据库独立解决方案
已邀请:
行级安全性实际上最好在数据库本身中完成。当您获取连接时,必须告知数据库您的用户上下文是什么。该用户与一个或多个安全组关联。然后,数据库会自动将过滤器附加到用户提供的查询中,以过滤出安全组中看不到的内容。当然,这意味着这是每个数据库类型的解决方案。 Oracle具有很好的行级安全性支持,请参见http://www.orafusion.com/art_fgac.htm作为示例。
我们将其实现为JDBC包装器。 该包装器仅解析和转换SQL。 Hibernate过滤器也是一个好主意,但是我们有许多报告和临时查询,Hibernate并不是访问应用程序中数据的唯一工具。 jsqlparser是一个出色的开源SQL解析器,但我们必须对其进行分叉以修复某些问题并添加对某些高级SQL功能的支持,例如ROLLUP用于报告目的https://github.com/jbaliuka/sql-analytic 该报告工具在github上也可用,但不依赖于行级安全性基础设施https://github.com/jbaliuka/x4j-analytic
有一篇有用的文章:http://mattfleming.com/node/243 这个想法是,您可以通过两种方式实现行级功能:直接在存储库中设置限制或通过AOP绑定限制。后者是首选,因为安全层应与业务逻辑(正交问题)分开。 在Hibernate中,您可以使用透明应用的过滤器的概念,而存储库不知道这些过滤器。您可以通过AOP添加此类过滤器。另一种方法是拦截session.createCriteria()并使用AOP透明地将限制添加到条件中。

要回复问题请先登录注册