我加入了一个项目,该项目使用Spring和Hibernate以及敏捷方法构建了一年,它没有使用Spring Data,并且有自己的用户类(不是org.springframework.security.core.userdetails.User
的派生)。
审计作为一项需要实施的新任务应运而生。(仅仅记录控制器的名称是不够的,我们必须记录每个DB字段的更改,以及是哪个用户更改的。一个控制器可以导致很多DB字段更改。)我的选项是什么?
我一直在看Javers、Envers和Audit4j。Javers需要Spring Data,所以它已经发布了。Envers唯一的要求是Hibernate,它是经过统计的,但我仍然不知道User对象将如何从控制器传递给它(User的auth令牌在请求对象中)。
Hibernate Envers只为您提供版本控制(对象在什么时候发生了什么),但它不能帮助您确定是谁做了更改。
who部分的一个简单解决方案是在所有要审计的对象(即在基类(如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();}