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)的主要内容,如果未能解决你的问题,请参考以下文章
Spring webflow + Jpa + Hibernate运行时无响应问题处理
将演示文稿(Struts)参数传递给(Spring)ApplicationContext并在Hibernate Interceptor中使用它们