- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Spring Data JPA的Audit功能审计数据库的变更由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
我最新最全的文章都在 南瓜慢说 www.pkslow.com ,欢迎大家来喝茶! 。
数据库审计是指当数据库有记录变更时,可以记录数据库的变更时间和变更人等,这样以后出问题回溯问责也比较方便。对于审计表记录的变更可以两种方式,一种是建立一张审计表专门用于记录,另一种是在数据库增加字段。本文所讨论的是第二种方案.
那如何在新增、修改、删除的时候同时增加记录呢?如果每张表都单独记录,代码就会显得很冗余。更好的方式应该是做切面或者事件监听,当数据有变更时统一进行记录.
Spring Data JPA为我们提供了方便的Audit功能,通过四个注解来标记字段:
(1) @CreatedBy: 创建人 。
(2) @CreatedDate: 创建时间 。
(3) @LastModifiedBy: 最后修改人 。
(4) @LastModifiedDate: 最后修改时间 。
接下来我们来看看怎么使用.
通过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
|
其实父类不是必须的,你可以在每个想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
}
|
数据总是被修改的,我们要提供一个获取修改人名字的接口,配置如下:
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开启了审计功能.
我们通过一个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
>}
|
查看数据库,已经生成了审计记录:
代码请查看: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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在我正在开发的应用程序中,我使用 spring、hibernate 和 envers 进行审计。 envers 适用于 hibernateTemplate.insert、hibernateTempla
我可以审核 Oracle 约束违规吗? 我在表中创建了一个约束,我想在某些进程违反此约束时对其进行审核。这可能吗?我该怎么做? 我正在使用 Oracle 11g。 最佳答案 作为选项之一,您可以创建架
我正在使用 IPostUpdateEventListener现在进行更新审计日志的接口(interface),获取旧值和新值,然后将每个更新的字段存储在“审计”表中以及所有这些内容。效果很好,但是我很
我目前正在尝试对公司 Web 应用程序的 UI 进行性能调整。该应用程序只会被员工访问,因此服务器和客户端之间的连接速度将始终比在互联网上快得多。 我一直在使用 Y Slow 等性能审计工具!和谷歌浏
如何获取 MySQL 中特定数据库的审核日志文件。由于数据库位于服务器中,我没有任何管理员权限。但我需要审核日志文件。是否有查询或方法来获取所有审核文件 最佳答案 据我所知,无法通过 sql 检索审核
我正在处理一个非常大的 PHP 代码库(主要是程序代码库),该代码库是在过去 10 年中由我之前的开发人员拼凑而成的,现在我们正承受着沉重的数据库负载。查看一些文件会发现执行了 40 到 60 个以上
我想知道是否有人成功地使用 Hibernate Envers 审核了 native 查询 (SQL)?我知道这可能是错误的,但它会节省我很多重构时间。 干杯 尼克 最佳答案 我只想在这里留下我的想法,
Python 3.8 引入了 PEP 578 -- Python Runtime Audit Hooks它 promise “使 Python 运行时采取的操作对审计工具可见。” 此 pep 提供了一
什么是适合以下的数据库?我对你在非关系领域的经历特别感兴趣 NoSQL系统。 它们对这种用法有好处吗,您使用过并推荐哪种系统,还是应该使用普通的关系数据库 (DB2)? 我需要从一堆来源收集审计跟踪/
据我了解,安全事件日志无法复制到 WAD 诊断存储,并且 SQL Server 审核不适用于 SQL Azure。 您提出了哪些解决方案来审核对 SQL Azure 数据库的访问? 至少应该是登录名、
我们正在使用 kafka 构建异常管理工具。将有源连接器 - 它将从物理文件中提取记录。另一方面,将会有接收器连接(mongodb-sinkconnect),它将从主题中拉取记录并将其推送到 mong
我试图实现一种跟踪数据更改并为我的应用程序创建历史日志的方法。因为我正在使用 EclipseLink,所以应该很容易并且有可能获得像他们这样的更改 write on the EclipseLink F
我有一个对象,在将它发送到 Spring Cloud Stream 之前我试图对其进行审核,当我将对象作为 application/json 发送时出现问题,因此拦截器将对象作为序列化接收字符串。是否
是否有审计工具可以检查 Linux 上打开和关闭哪些端口以及何时打开和关闭?我的目标是运行我的应用程序并检查其端口使用情况。lsof 或 netstat 不适合,因为它们只是告诉我当前打开了哪些端口,
TLDR:是否可以利用npm audit的漏洞检测能力?作为一种 Restful 服务而不是当前的 CLI 实现? npm针对 Node 安全平台 (NSP) 漏洞数据库,针对每个安装请求提供自动漏洞
背景我有一个生产 SQL Server 2005 服务器,4 个不同的应用程序连接到该服务器并进行更改。没有外键,在某些情况下也没有主键。不幸的是,放弃整个事情并从头开始不是一种选择。所以我的解决方案
我有项目要维护,使用 node-sass npm 模块。 从 node 10.x 开始,有一个工具(称为 npm audit)会在我们每次执行 npm install 时运行。这似乎是防止漏洞问题的好
我刚刚为我们的开发团队设置了一个 Phabricator 服务器,我已经很喜欢了!首先,我们仅将其用于代码审查。 UI 在长度上远远优于 GitHub 的评论。 无论如何,因为我想在我们的团队中简化它
作为新 PCI-DSS 服务器部署的一部分,我正在配置一个完全可审计的 NTP 时间更改历史记录。一切都按预期工作,但是我现在看到每一秒都写入与时间更改操作相关的审计日志。经过大量搜索后,我仍然无法理
我有一个带有数据的表格。任何更改或插入,这些数据都应该在两个不同的表中更新,例如一个表中的姓名、薪水和另一个表中的地址、邮件 ID。 像上面的例子一样,我在两个表中都有几列。 现在我想审核表格。所以我
我是一名优秀的程序员,十分优秀!