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!