首页 文章

如何在Spring Boot中使用DynamoDB实现审计?

提问于
浏览
1

我've dynamoDB database, in which I'有一个名为 user 的表 . 我想在此表中记录审核( CreatedByLastModifiedByCreatedDateLastModifiedDate ) .

我发现JPA审核(from here)和MongoDB审核分别带有注释 @EnableJpaAuditing@EnableMongoAuditing . 但显然他们没有使用dynamoDB .

这是我的审计抽象类:

@DynamoDBDocument
public abstract class PQSSAbstractAuditingEntity implements Serializable{
    @CreatedBy
    @JsonIgnore
    @DynamoDBAttribute
    private String createdBy;

    @LastModifiedBy
    @JsonIgnore
    @DynamoDBAttribute
    private String lastModifiedBy;

    @CreatedDate
    @JsonIgnore
    @DynamoDBAttribute
    private Date createdDate;

    @LastModifiedDate
    @JsonIgnore
    @DynamoDBAttribute
    private Date lastModifiedDate = new Date();

    public String getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    public String getLastModifiedBy() {
        return lastModifiedBy;
    }

    public void setLastModifiedBy(String lastModifiedBy) {
        this.lastModifiedBy = lastModifiedBy;
    }

    public Date getCreatedDate() {
        return createdDate;
    }

    public void setCreatedDate(Date createdDate) {
        this.createdDate = createdDate;
    }

    public Date getLastModifiedDate() {
        return lastModifiedDate;
    }

    public void setLastModifiedDate(Date lastModifiedDate) {
        this.lastModifiedDate = lastModifiedDate;
    }
}

我've assigned dates to respective fields but I' ve设置 createdBylastModifiedBy ,具体取决于登录用户 . 因此,当在数据库中添加新条目时,我将在运行时动态获取 . 我知道如何静态设置这些字段,但问题是如何在运行时使注释知道这些更改 .

正如我所提到的,我为JPA和mongo找到了 AuditAware . 我需要为dynamoDB提供相同的功能 .

任何帮助将不胜感激 . 因为我是Spring的新手 .

2 回答

  • 1

    这个问题已经有几年了,但是如果有人也有这个问题,那么以下的解决方案就可以了 .

    问题是, @EnableDynamoDBAuditing@EnableDynamoDBRepositories 无法正常工作 . 要解决此问题,您必须将两个注释添加到配置类,创建 AuditorAwareDateTimeProvider beans并手动将所有实体/文档添加到 DynamoDBMappingContext .

    PersistenceConfiguration.java

    @Configuration
    @EnableDynamoDBAuditing(auditorAwareRef = "userAuditing", dateTimeProviderRef = "dateAuditing")
    @EnableDynamoDBRepositories(basePackages = "your.repository.package.name")
    public class PersistenceConfiguration {
    
        @Bean
        public AuditorAware<String> userAuditing() {
            return () -> Optional.of("TestUser"); //get username from SecurityContext
        }
    
        @Bean
        public DateTimeProvider dateAuditing() {
            return CurrentDateTimeProvider.INSTANCE;
        }
    
        @Bean
        public DynamoDBMappingContext dynamoDBMappingContext() {
            DynamoDBMappingContext mappingContext = new DynamoDBMappingContext();
    
            //add your 'entities' manually 
            mappingContext.getPersistentEntity(YourEntity.class); 
    
            return mappingContext;
        }
    
        // do further configuration stuff...
    }
    

    YourEntity.java

    @DynamoDBTable(tableName = "YourEntity")
    public class YourEntity {
       @CreatedDate
       @DynamoDBAttribute
       @DynamoDBTypeConverted(converter = LocalDateTimeConverter.class)
       private LocalDateTime createdOn;
    
       @CreatedBy
       @DynamoDBAttribute
       private String createdBy;
    
       @LastModifiedDate
       @DynamoDBAttribute
       @DynamoDBTypeConverted(converter = LocalDateTimeConverter.class)
       private LocalDateTime updatedOn;
    
       @LastModifiedBy
       @DynamoDBAttribute
       private String updatedBy;
    
       // add further properties...
    }
    

    我知道还有一些其他的解决方案,如 @DynamoDBAutoGeneratedTimestamp 和他们的策略的使用,但在我看来,这是关于使用 spring 最干净的解决方案 .

  • 0

    注释 @DynamoDBAutoGeneratedTimestamp 可与 DynamoDBAutoGenerateStrategy 一起用于审核项目 .

    Strategy CREATE (Use this for Create audit):-

    @DynamoDBAutoGeneratedTimestamp(strategy=DynamoDBAutoGenerateStrategy.CREATE)
     public Date getCreatedDate() { return createdDate; }
     public void setCreatedDate(Date createdDate) { this.createdDate = createdDate; }
    

    Strategy ALWAYS (Use this if you want last modified date):-

    @DynamoDBAutoGeneratedTimestamp(strategy=DynamoDBAutoGenerateStrategy.ALWAYS)
     public Date getLastUpdatedDate() { return lastUpdatedDate; }
     public void setLastUpdatedDate(Date lastUpdatedDate) { this.lastUpdatedDate = lastUpdatedDate; }
    

    如果您想同时创建时间戳和上次修改的时间戳,请创建两个不同的属性 . 一个属性应该使用CREATE策略,而另一个应该使用ALWAYS策略 .

    AutoGeneratedTimeStamp

相关问题