【问题标题】:How to implement row-level security in Java?如何在 Java 中实现行级安全性?
【发布时间】:2011-08-08 15:27:22
【问题描述】:

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

Apache Shiro 看起来很不错,但我缺少行级安全功能。

例如数据库中可能有特殊的行,只有具有特殊权限的用户才能看到和访问。 为避免不必要的往返,我们目前修改 SQL 查询以加入我们的授权数据,以仅获取当前用户的可见行。

但我觉得这个概念并不“正确”,因为我们将业务代码与安全相关代码混合在一起,它们应该是正交且相互独立的。

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

更新:

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

【问题讨论】:

  • 你的目标数据库是什么?

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


【解决方案1】:

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

Oracle 有很好的行级安全支持,以http://www.orafusion.com/art_fgac.htm 为例。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您是否开源了您的 jdbc 包装器?在我看来,“行级安全 jdbc 包装器”将是这里的最佳解决方案。我尝试了 jpasecurity,这看起来很费劲,但它是否符合 JPA 规范值得怀疑。
    • 我改进了这个库以支持类似于 postgres 的策略,它是一个新代码,而不是我用于报告的内部内容,但这个新代码应该更有用,因为它也支持 DML。我不确定我是否有时间维护它,因为所有主要数据库都已经在内部支持 RLS(Postgres、Oracle、MS SQL Server)
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-23
      • 2019-10-15
      • 2019-04-26
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多