JHipster的基础应用里实现了对用户登录的审计功能,该功能可以控制用户密码输入错误次数。此外,通过扩展模块实现了实体审计功能。
实体的审计功能分两个方面:
- 在对实体进行创建或者修改时,自动添加用户和更改日期等信息。
- 在对实体进行创建或者修改时,系统自动记录每次更改的内容,相当于对实体实现版本记录功能。
下面来分别看一下JHipster的具体实现方式。
用户登录审计功能:
创建自定义repository来实现AuditEventRepository,如下所示:
@Repository
public class CustomAuditEventRepository implements AuditEventRepository {
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void add(AuditEvent event) {
if (!AUTHORIZATION_FAILURE.equals(event.getType()) &&
!Constants.ANONYMOUS_USER.equals(event.getPrincipal())) {
PersistentAuditEvent persistentAuditEvent = new PersistentAuditEvent();
persistentAuditEvent.setPrincipal(event.getPrincipal());
persistentAuditEvent.setAuditEventType(event.getType());
persistentAuditEvent.setAuditEventDate(event.getTimestamp());
Map<String, String> eventData = auditEventConverter.convertDataToStrings(event.getData());
persistentAuditEvent.setData(truncate(eventData));
persistenceAuditEventRepository.save(persistentAuditEvent);
}
}
}
当用户登录成功或失败后,系统会记录如下信息:
实体审计功能(一)添加用户和日期信息
可以分为三步走,第一步添加类实现AuditorAware,用以获取用户信息,如下:
@Component
public class SpringSecurityAuditorAware implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
return Optional.of(SecurityUtils.getCurrentUserLogin().orElse(Constants.SYSTEM_ACCOUNT));
}
}
第二步创建抽象类,利用@CreatedBy等注解让spring boot自动添加用户和日期等信息,如下:
public abstract class AbstractAuditingEntity implements Serializable {
private static final long serialVersionUID = 1L;
@CreatedBy
@Field("created_by")
@JsonIgnore
@DiffIgnore
private String createdBy;
@CreatedDate
@Field("created_date")
@JsonIgnore
@DiffIgnore
private Instant createdDate = Instant.now();
@LastModifiedBy
@Field("last_modified_by")
@JsonIgnore
@DiffIgnore
private String lastModifiedBy;
@LastModifiedDate
@Field("last_modified_date")
@JsonIgnore
@DiffIgnore
private Instant lastModifiedDate = Instant.now();
}
第三步使实体类继承上面创建的抽象类。
@Document(collection = "author")
public class Author extends AbstractAuditingEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String id;
@Field("name")
private String name;
@Field("birth_date")
private LocalDate birthDate;
}
完成以上动作,在数据库中的记录如下:
实体审计功能(二)实体的版本记录
该功能的实现,可以提供实体的被改变的信息记录,更改前的值,何时何人更改。JHipster主要通过依赖JaVers来实现,具体操作如下。
首先,在pom.xml中引入依赖
<dependency>
<groupId>org.javers</groupId>
<artifactId>javers-spring-boot-starter-mongo</artifactId>
<version>5.8.8</version>
</dependency>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.4.2</version>
</dependency>
其次创建类来实现AuthorProvider,提供操作用户信息。
@Component
public class JaversAuthorProvider implements AuthorProvider {
@Override
public String provide() {
return SecurityUtils.getCurrentUserLogin().orElse(Constants.SYSTEM_ACCOUNT);
}
}
最后在需要进行版本控制的实体对应repository添加注解@JaversSpringDataAuditable
import com.mycompany.myapp.domain.Author;
import org.javers.spring.annotation.JaversSpringDataAuditable;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
/**
* Spring Data MongoDB repository for the Author entity.
*/
@SuppressWarnings("unused")
@Repository
@JaversSpringDataAuditable
public interface AuthorRepository extends MongoRepository<Author, String> {
}
完成以上配置后,每当创建一个新的实体或修改实体,系统会自动记录所有过程,数据库记录如下图所示:
JHipster的Audit Log页面如下图所示:
Good Luck,
Cheers!