2011-04-19 30 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