跟着JHipster學做項目 (4)審計功能

JHipster的基礎應用裏實現了對用戶登錄的審計功能,該功能可以控制用戶密碼輸入錯誤次數。此外,通過擴展模塊實現了實體審計功能。

實體的審計功能分兩個方面:

  1. 在對實體進行創建或者修改時,自動添加用戶和更改日期等信息。
  2. 在對實體進行創建或者修改時,系統自動記錄每次更改的內容,相當於對實體實現版本記錄功能。

下面來分別看一下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;

}

完成以上動作,在數據庫中的記錄如下:

author

實體審計功能(二)實體的版本記錄

該功能的實現,可以提供實體的被改變的信息記錄,更改前的值,何時何人更改。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> {
}

完成以上配置後,每當創建一個新的實體或修改實體,系統會自動記錄所有過程,數據庫記錄如下圖所示:

sanpshot

JHipster的Audit Log頁面如下圖所示:

entity

Good Luck,

Cheers!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章