为了审计目的,使用 Hibernate 在 syscontext/connection 上传递 ClientInfo/ClientIdentifier

Passing ClientInfo/ClientIdentifier on syscontext/connection with Hibernate for audit purposes

我有一个将 inserts/updated 数据处理到数据库的 Web 服务。当客户端调用此 web 服务时,UserId(当前登录用户到门户)将在请求中发送。我需要将此 userId 传递给 Db 连接或将其设置在 sys context 中以实现 审计目的 。我们有现有的审计 tables 和触发器 inserts/updates 在实际 insert/update 之后审计 table table。因此,为了跟踪这些更改,我需要以某种方式将此 UserId 传递给 connection,以便它可以从 Sys Context 或 $session 的数据库中检索并插入 Audit table。我目前正在使用 Spring 和 Hibernate 事务处理 DB 数据。

我尝试在 Connection 上设置客户端信息,但它不起作用。我在下面试过:

Session session=sessionFactory.getCurrentSession();
SessionImpl sImpl=(SessionImpl) session;
Connection connection=sImpl.connection();
connection.setClientInfo("ClientUser", "ABC");

而且我还尝试通过调用存储过程 DBMS_APPLICATION_INFO.SET_CLIENT_INFO 来设置客户端信息,然后每次从应用程序 code.but 对数据库执行操作之前,我不是如果这是正确的处理方式,请起诉。

我正在尝试使用 OCI 和精简 JDBC 驱动程序,但无法找到设置此用户 ID 的方法。

有人可以告诉我是否有任何有效的方法可以在 sys 上下文或 Connection 上传递用户 ID。我目前正在使用 hibernate4、Spring、Websphere Server、Oracle DB。

我正在使用 Spring @Transactional 来处理休眠连接和事务以在 DB.Connections 上执行操作来自连接池,我正在使用 org.springframework.jndi.JndiObjectFactoryBean 对于 数据源

当我们从连接池获取连接时,有什么方法可以让拦截器或包装器围绕连接进行设置。

以前有人做过吗?

这在spring data JDBC Extensions for the Oracle Database

中有描述

章节

8.2 Configuration of a Custom DataSource Connection Preparer

...but you could implement a ConnectionPreparer that would use the current users login id. That way you can capture user login information even if your data source is configured with a shared user name.

这是 oracle 的解决方案,我想你正在使用它。也应该可以将其适应另一个数据库。