gpt4 book ai didi

Spring Data JPA的Audit功能审计数据库的变更

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Spring Data JPA的Audit功能审计数据库的变更由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

我最新最全的文章都在 南瓜慢说 www.pkslow.com ,欢迎大家来喝茶! 。

1 数据库审计

数据库审计是指当数据库有记录变更时,可以记录数据库的变更时间和变更人等,这样以后出问题回溯问责也比较方便。对于审计表记录的变更可以两种方式,一种是建立一张审计表专门用于记录,另一种是在数据库增加字段。本文所讨论的是第二种方案.

那如何在新增、修改、删除的时候同时增加记录呢?如果每张表都单独记录,代码就会显得很冗余。更好的方式应该是做切面或者事件监听,当数据有变更时统一进行记录.

2 Spring Data JPA审计

Spring Data JPA为我们提供了方便的Audit功能,通过四个注解来标记字段:

(1) @CreatedBy: 创建人 。

(2) @CreatedDate: 创建时间 。

(3) @LastModifiedBy: 最后修改人 。

(4) @LastModifiedDate: 最后修改时间 。

接下来我们来看看怎么使用.

2.1 项目准备

通过Docker启动PostgreSQL数据库:

?
1
2
3
4
5
6
7
8
docker run -itd \
     --name pkslow-postgres \
     -e POSTGRES_DB=pkslow \
     -e POSTGRES_USER=pkslow \
     -e POSTGRES_PASSWORD=pkslow \
     -e PGDATA= /var/lib/postgresql/data/pgdata \
     -p 5432:5432 \
     postgres:10

引入相关依赖:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
   <groupId>org.postgresql</groupId>
   <artifactId>postgresql</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Spring Security不是必须的,这里使用它来获取用户名。配置的用户为:

?
1
2
spring.security.user.name=pkslow
spring.security.user.password= 123456

2.2 创建实体父类

其实父类不是必须的,你可以在每个想Audit的实体类进行配置,但比较麻烦,不如创建一个父类,再让想审计的子类都继承它:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@MappedSuperclass
@EntityListeners (AuditingEntityListener. class )
public class Auditable<U> {
     @CreatedBy
     @Column (name = "created_by" )
     private U createdBy;
 
     @CreatedDate
     @Column (name = "created_date" )
     private Date createdDate;
 
     @LastModifiedBy
     @Column (name = "last_modified_by" )
     private U lastModifiedBy;
 
     @LastModifiedDate
     @Column (name = "last_modified_date" )
     private Date lastModifiedDate;
   // getter
   //setter
}

@MappedSuperclass可以让其它子实体类继承相关的字段和属性; 。

@EntityListeners设置监听类,会对新增和修改进行回调处理.

有了父类之后,子类就简单了:

?
1
2
3
4
5
6
7
8
9
10
11
12
@Entity
@Table (name = "pkslow_users" )
public class User extends Auditable<String> {
     @Id
     @GeneratedValue (strategy = GenerationType.AUTO)
     private Long userId;
     private String name;
     private String email;
     private String country;
     private String website;
   //getter setter
}

2.3 如何获取名字

数据总是被修改的,我们要提供一个获取修改人名字的接口,配置如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Configuration
@EnableJpaAuditing (auditorAwareRef = "auditorProvider" )
public class JpaAuditingConfiguration {
 
     @Bean
     public AuditorAware<String> auditorProvider() {
         return () -> {
             String username = "system" ;
             SecurityContext context = SecurityContextHolder.getContext();
             if (context != null ) {
                 Authentication authentication = context.getAuthentication();
                 if (authentication != null ) {
                     username = authentication.getName();
                 }
             }
 
             String result = username;
             return Optional.ofNullable(result);
         };
     }
}

这里配置的是通过Spring Security的Context来获取登陆用户的名字,当然可以有其它方案,如获取请求头的某个字段等.

注意注解@EnableJpaAuditing开启了审计功能.

2.4 测试

我们通过一个Controller来新增数据,看看会有什么效果:

?
1
2
3
4
5
6
7
8
9
10
@RestController
@RequestMapping ( "/user" )
public class UserController {
     @Autowired
     private UserRepository userRepository;
     @PostMapping
     public User save( @RequestBody User user) {
         return userRepository.save(user);
     }
}

通过curl命令来测试如下:

?
1
2
3
4
5
6
7
8
9
10
$ curl 'http://localhost:8088/user' -X POST \
> -H 'Content-Type: application/json' \
> -H 'Authorization:Basic cGtzbG93OjEyMzQ1Ng==' \
> -d '{
>     "name" : "larry" ,
>     "email" : "admin@pkslow.com" ,
>     "country" : "China" ,
>     "website" : "www.pkslow.com"
> }'
{ "createdBy" : "pkslow" , "createdDate" : "2021-01-15T15:08:47.035+0000" , "lastModifiedBy" : "pkslow" , "lastModifiedDate" : "2021-01-15T15:08:47.035+0000" , "userId" :7, "name" : "larry" , "email" : "admin@pkslow.com" , "country" : "China" , "website" :<a href= "http://www.pkslow.com/" rel= "external nofollow" >www.pkslow.com< /a >}

查看数据库,已经生成了审计记录:

Spring Data JPA的Audit功能审计数据库的变更

3 总结

代码请查看:https://github.com/LarryDpk/pkslow-samples 。

到此这篇关于Spring Data JPA的Audit功能审计数据库的变更的文章就介绍到这了,更多相关Spring Data JPA审计数据库变更内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://www.cnblogs.com/larrydpk/archive/2021/06/26/14933339.html 。

最后此篇关于Spring Data JPA的Audit功能审计数据库的变更的文章就讲到这里了,如果你想了解更多关于Spring Data JPA的Audit功能审计数据库的变更的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com