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

时间:2011-04-19 12:21:02

标签: java sql security shiro row-level-security

我目前正在评估身份验证/授权框架。

Apache Shiro似乎非常好,但我缺少行级安全性功能。

E.g。数据库中可能存在特殊行,只有具有特殊权限的用户才能看到和访问这些行。 为避免不必要的往返,我们目前修改SQL查询以与我们的授权数据连接,以仅获取当前用户的可见行。

但是这个概念对我来说并不合适,因为我们将业务代码与安全相关的代码混合,这些代码应该是正交的,彼此独立。

  • 有哪些/可能的解决方案?
  • 如何实施行级安全性(特别是与jpa结合使用)

更新

目标数据库主要是Oracle 10g / 11g
- 但如果没有大的缺点,则首选独立于数据库的解决方案

3 个答案:

答案 0 :(得分:8)

行级安全性最好在数据库本身中完成。在获取连接时,必须告知数据库您的用户上下文是什么。该用户与一个或多个安全组相关联。然后,数据库会自动将过滤器附加到用户提供的查询,以过滤掉安全组中无法看到的内容。这当然意味着这是一个每个数据库类型的解决方案。

Oracle具有非常好的行级别安全性支持,请参阅http://www.orafusion.com/art_fgac.htm作为示例。

答案 1 :(得分:2)

我们将其实现为JDBC包装器。 这个包装器只是解析和转换SQL。 Hibernate过滤器也是个好主意,但我们有很多报告和临时查询,Hibernate并不是我们应用程序中访问数据的唯一工具。 jsqlparser是一个优秀的开源SQL解析器,但我们必须分叉它来修复一些问题,并添加一些高级SQL功能的支持,例如ROLLUP用于报告目的https://github.com/jbaliuka/sql-analytic 此报告工具也可在github上使用,但不依赖于行级安全性基础结构https://github.com/jbaliuka/x4j-analytic

答案 2 :(得分:0)

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

您的想法是可以通过两种方式实现行级功能:直接在存储库中设置限制或通过AOP绑定限制。后者是首选,因为安全层应与业务逻辑(正交问题)分开。

在Hibernate中,您可以使用透明应用的过滤器概念,并且存储库不了解它们。您可以通过AOP添加此类过滤器。另一种方法是拦截session.createCriteria()并使用AOP透明地向条件添加限制。