【发布时间】:2017-02-12 20:19:02
【问题描述】:
我正在尝试实施行级安全性,以便我们的应用程序可以实施更严格的访问控制。
我们正在研究的其中一项技术是 Oracle 的虚拟专用数据库,它通过基本上使用 where 子句谓词增强针对特定表的所有查询来实现行级安全性。由于我们处于 Web 环境中,因此我们需要在 Oracle 中设置一个特殊的上下文,在单个请求的线程中。我们通过服务帐号使用连接池。
我开始研究 Eclipse Link 和 Hibernate。 Eclipse Link 似乎有 events 非常适合这个模型。
这将涉及我们从休眠状态迁移,这不是问题,但我们会为这些事件绑定到 EL。
Oracle 似乎暗示他们在Web Logic product 中的数据源级别实现。
上下文由 WebLogic 数据源代码设置和清除。
问题:在 DataSource 级别使用某些系列事件执行此操作是否更合适。我最应该关注的事件或方法是什么?
添加的问题:如何扩展连接池以使用一些自定义数据安全地初始化 oracle 上下文?我在 Apache 中进行挖掘,似乎扩展 BasicDataSource 并没有让我访问任何可以让我在 Spring 完成后清理连接的东西。
我需要建立一个连接,并清理一个连接作为退出/进入连接池。我希望有一个如此简单的实现,没有人可以通过打破产品的一些微妙平衡来搞砸它。
- Specifically we are currently using Apache Commons DBCP Basic Data Source
这将允许我们使用各种方式连接到数据库并仍然强制执行我们的安全性。但我没有看到一个很好的例子或一组事件可以使用,滚动我自己的安全生命周期从来都不是一个好主意。
【问题讨论】:
-
我不会在连接池方面这样做,因为连接池通常没有(我认为他们不应该有)关于用户执行请求或请求的信息。
-
oracle JDBC连接不应该最终维护oracle连接上下文吗?
-
我想是的。因此,如您所述,需要基于每个请求设置 Oracle VPD 参数,并在将连接返回到池时清除这些参数。对我来说,Eclipse Link 方法在这种情况下是最好的,但是我找不到 Hibernate/Hibernate+Spring 的等效方法,但我认为这是解决这个问题的最佳方法。
-
感谢您的帮助,我担心将我的安全模型绑定到高级框架。你同意吗?问题是,我可以扩展基本数据源,但我还必须扩展 GenericObject 池。我可以只覆盖 GetConnection,并始终在该方法中清除/设置信息,但是在将其返回池时我无法清除它。
-
多考虑一下,也许正如您所说,覆盖 DBCP
BasicDataSource是一个好方法。我会查看.getConnection()和PoolableConnection.close()进行清理,并检查使用汇集的准备好的语句是否会影响行为(尽管我不这么认为)。缓存肯定会影响行为,因此您可能也需要对此进行研究。我同意在 Hibernate 级别执行此操作并不理想。但是由于涉及池,您肯定需要至少按照您的描述更改您的连接池,我在这里发表评论。寻求进一步的建议。
标签: java oracle datasource apache-commons-dbcp