一尘不染

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

hibernate

我有一个Web服务,可处理向DB中插入/更新的数据。当客户端调用此Web服务时, UserId
(当前登录到门户的用户)将在Request中发送。我需要将此userId传递给Db连接,或者在 sys上下文 中将其设置为 Audit目的
。我们已经有现有的审计表和触发器,可以在对实际表进行插入/更新后对审计表进行插入/更新。因此,为了跟踪这些更改,我需要以某种方式将此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来处理hibernate连接和事务以对DB执行操作。连接来自连接池,并且我正在将
org.springframework.jndi.JndiObjectFactoryBean 用于 dataSource

当我们从连接池中获得连接时,有什么方法可以在连接周围设置拦截器或包装器。

有人做过吗?


阅读 193

收藏
2020-06-20

共1个答案

一尘不染

在Oracle数据库的Spring数据JDBC扩展中对此进行了描述

章节

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

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

这是我认为您正在使用的oracle解决方案。还应该有可能使其适应另一个数据库。

2020-06-20