【问题标题】:Spring + Hibernate auditing (no Spring Data)Spring + Hibernate 审计(无 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 对其进行配置。
  • 你能更新一下你选择了什么以及到目前为止的情况吗?

标签: java spring hibernate audit hibernate-envers


【解决方案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 中
猜你喜欢
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 2018-02-04
  • 2019-05-25
  • 2016-06-02
  • 2017-05-22
  • 2015-01-20
  • 2019-11-17
相关资源
最近更新 更多