安全地包装连接池

我正在尝试实现行级别安全性,以便我们的应用程序可以强制实施更严格的访问控制。

我们正在研究的技术之一是Oracle的虚拟专用数据库,它基本上通过使用子句谓词来增强针对特定表的所有查询,从而实现行级安全性。由于我们处于Web环境中,因此我们需要在Oracle中,在单个请求的线程内设置一个特殊的上下文。我们将连接池与服务帐户结合使用。where

我开始研究Eclipse Link和Hibernate。Eclipse Link似乎有完全适合这个模型的事件

这将涉及我们从休眠状态迁移,这不是问题,但是对于这些事件,我们将绑定到EL。

Oracle似乎暗示它们在Web Logic产品的数据源级别实现。

上下文由 WebLogic 数据源代码设置和清除。

问题:在数据源级别对某些系列事件执行此操作是否更合适。我最应该注意的事件或方法是什么?

新增问题:如何扩展连接池以使用某些自定义数据安全地初始化 oracle 上下文?我正在Apache中挖掘,似乎扩展BasicDataSource并不能让我访问任何允许我在Spring完成连接时清理连接的东西。

我需要设置一个连接,并在退出/进入连接池时清理连接。我希望实现起来如此简单,没有人能通过打破产品的一些微妙平衡来搞砸它。

- Specifically we are currently using Apache Commons DBCP Basic Data Source

这将允许我们使用各种方式连接到数据库,并且仍然强制实施安全性。但是我没有看到一个很好的例子或一组事件可以使用,滚动我自己的安全生命周期从来都不是一个好主意。


答案 1

我最终通过扩展一些Apache组件解决了我的问题。

首先,我扩展并覆盖了和.我知道池中物体的类型(),所以我可以安全地投掷和使用它们。org.apache.commons.pool.impl.GenericObjectPoolborrowObject()returnObject()java.sql.Connection

由于对于我的情况,我使用的是Oracle VPD,因此我能够在应用程序上下文中设置信息。我建议您更深入地阅读有关此内容的信息。它有点复杂,并且有很多不同的选项可以在各种上下文级别以及跨RAC节点隐藏或共享数据。开始

从本质上讲,我所做的是生成一个随机数并使用它来实例化oracle中的会话,然后将用户的访问级别设置为该会话中的变量,然后Oracle VPD策略将读取该变量并使用它来执行行级别筛选。

我在被覆盖的和运行的SQL中实例化并销毁了该信息,如下所示:borrowObject()returnObject()

CallableStatement callStat =
                    conn.prepareCall("{call namespace.cust_ctx_pkg.set_session_id(" + Math.random() + ")}");
                  callStat.execute();

注意 math.random() 不是一个好的随机数。

接下来是通过覆盖来简单地扩展和设置我的对象池。请注意,我这样做的方式禁用了一些我不需要的功能,所以你可能需要重写更多或更少的功能。org.apache.commons.dbcp.BasicDataSourcecreateConnectionPool()


答案 2

为了简单起见,您可以尝试任何对象级安全机制,例如Spring Security ACL。


推荐