春季-在syscontext上传递ClientInfo / ClientIdentifier /与Hibernate进行连接以进行审核

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

我试图在“连接”上设置客户端信息,但无法正常工作.我在下面尝试过:

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

而且我每次通过应用程序代码对数据库执行操作之前,都试图通过调用存储过程DBMS_APPLICATION_INFO.SET_CLIENT_INFO来设置客户端信息.但是我不敢提一下这是否是正确的处理方法.

我正在使用OCI和瘦JDBC驱动程序进行尝试,但是找不到设置此用户ID的方法.

有人可以让我知道是否有任何有效的方法可以在sys上下文或Connection中传递用户ID.我目前正在使用hibernate4,Spring,Websphere Server,Oracle DB.

我正在使用Spring @Transactional来处理休眠连接和事务以对DB执行操作.连接来自连接池,并且我正在将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解决方案.还应该有可能使其适应另一个数据库.

转载注明原文:春季-在syscontext上传递ClientInfo / ClientIdentifier /与Hibernate进行连接以进行审核 - 代码日志