使用Hibernate在syscontext / connection上传递ClientInfo / ClientIdentifier以进行审计

时间:2016-05-01 00:40:22

标签: spring oracle hibernate websphere audit

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

我尝试在Connection上设置客户端信息,但它无法正常工作。我在下面尝试过:

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

我还试图通过调用存储过程 DBMS_APPLICATION_INFO.SET_CLIENT_INFO 来设置客户端信息,然后每次从应用程序代码执行DB操作。但如果它是正确的方法,我不会起诉处理它。

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

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

我正在使用Spring @Transactional来处理hibernate Connections和事务以在DB上执行操作。连接来自连接池,而我正在使用 org.springframework.jndi.JndiObjectFactoryBean 来获取 dataSource < / strong>即可。

当我们从连接池获得连接时,是否有任何方法可以使用拦截器或包装器来设置它。

以前有人这样做过吗?

1 个答案:

答案 0 :(得分:1)

spring data JDBC Extensions for the Oracle Database

中对此进行了描述

  

8.2自定义数据源连接准备者的配置

     

...但您可以实现一个使用当前用户登录ID的ConnectionPreparer。这样,即使您的数据源配置了共享用户名,也可以捕获用户登录信息。

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