Spring + Hibernate 审计(无 Spring Data)

Posted

技术标签:

【中文标题】Spring + Hibernate 审计(无 Spring Data)【英文标题】:Spring + Hibernate auditing (no Spring Data) 【发布时间】:2016-03-03 09:25:49 【问题描述】:

我加入了一个项目,该项目使用 Spring 和 Hibernate 使用敏捷方法构建了一年,它没有使用 Spring Data,并且有自己的用户类(不是 org.springframework.security.core.userdetails.User 的后代)。

审计作为一项新功能出现。 (仅记录调用了哪些控制器是不够的,我们必须记录每个 DB 字段的更改,以及是哪个用户进行的。一个控制器可以导致很多 DB 字段发生更改。)我的选择是什么?

我一直在关注 Javers、Envers 和 Audit4j。 Javers 需要 Spring Data,所以它被淘汰了。 Envers 的唯一要求是 Hibernate,这是已统计的,但我仍然看不到用户对象将如何从控制器传递给它(用户的身份验证令牌在请求对象中)。

【问题讨论】:

JaVers 根本不需要 Spring,我已经能够仅使用 Hibernate 对其进行配置。 你能更新一下你选择了什么以及到目前为止的情况吗? 【参考方案1】:

Hibernate Envers 只为您提供版本控制(对象在什么时间发生了什么),但它并不能帮助您确定是谁进行了更改。

who-part 的一个简单解决方案是在所有需要审计的对象上创建两个新字段(即在 AbstractAuditableEntity 等基类中):User createdBy;User lastModifiedBy;。添加两个方法(我假设你在这里使用 Spring Security):

@PrePersist
protected void setCreatedBy() createdBy = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();

@PreUpdate
protected void setCreatedBy() lastModifiedBy = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();

【讨论】:

Hibernate 支持自定义RevisionEntity,您可以在其中存储每个修订版的此类信息。 我还不了解 Spring Security。我可以通过调用静态对象方法而不是通过方法参数获取 SecurityContext 来获取主体,这对我来说似乎很奇怪。 Spring 是否对每个 http 会话的 SecurityContext 进行某种隐藏锁定? @zslevi 通常使用 ThreadLocal 填充在 ServletFilter 中

以上是关于Spring + Hibernate 审计(无 Spring Data)的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate Envers - 在启动时填写审计表

Spring webflow + Jpa + Hibernate运行时无响应问题处理

将演示文稿(Struts)参数传递给(Spring)ApplicationContext并在Hibernate Interceptor中使用它们

如何使用休眠环境避免不必要的审计

Hibernate-Envers:审计动态组件

仅生成 Hibernate Envers 的审计表