- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章解析Spring Data JPA的Audit功能之审计数据库变更由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
数据库审计是指当数据库有记录变更时,可以记录数据库的变更时间和变更人等,这样以后出问题回溯问责也比较方便。对于审计表记录的变更可以两种方式,一种是建立一张审计表专门用于记录,另一种是在数据库增加字段。本文所讨论的是第二种方案.
那如何在新增、修改、删除的时候同时增加记录呢?如果每张表都单独记录,代码就会显得很冗余。更好的方式应该是做切面或者事件监听,当数据有变更时统一进行记录.
Spring Data JPA为我们提供了方便的Audit功能,通过四个注解来标记字段:
(1) @CreatedBy: 创建人 。
(2) @CreatedDate: 创建时间 。
(3) @LastModifiedBy: 最后修改人 。
(4) @LastModifiedDate: 最后修改时间 。
接下来我们来看看怎么使用.
通过Docker启动PostgreSQL数据库:
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命令来测试如下:
$ 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":"www.pkslow.com"} 。
查看数据库,已经生成了审计记录:
代码请查看:https://github.com/LarryDpk/pkslow-samples 。
以上就是解析Spring Data JPA的Audit功能之审计数据库变更的详细内容,更多关于Spring Data JPA的Audit 审计数据库变更的资料请关注我其它相关文章! 。
原文链接:https://www.cnblogs.com/larrydpk/p/14933339.html 。
最后此篇关于解析Spring Data JPA的Audit功能之审计数据库变更的文章就讲到这里了,如果你想了解更多关于解析Spring Data JPA的Audit功能之审计数据库变更的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想将 Audit.EntityFramework 与 EntityFramework Core 结合使用,但仅忽略某些实体的审核日志中的插入。我在 Audit.EntityFramework 的 g
我在尝试获取引用未审计实体的审计实体时遇到问题。在我们的应用程序中,某些实体是在不使用 hibernate 的情况下引导的,这些实体是我们的元模型,不需要审计。 工作示例: public class
当我通过以下方式启用创建 session 审核时: audit create session by session; 然后我查询以下内容: select * from dba_priv_audit_o
嘿,这是我第一次使用 thepirat000 Audit.MVC 包,我已经做好了基础并且工作得很好: [Audit(EventTypeName = "InsertOrderAction", Incl
我必须将审计添加到我没有编码的系统中,并且在编程时也没有考虑审计。 然后我遇到了 Audit.Net,这是一个多么棒的框架! 我也在使用 Audit.Mvc 扩展。 无论如何,我想在 HomeCont
这是我得到的错误: npm ERR! code ENOAUDIT npm ERR! audit Your configured registry (https://registry.npmjs.org
我正在试着写一个小的Hello world程序,并用战争来包装它。我正在使用maven并编写一个SpringBoot应用程序来做这件事。。以下是我的Application.Java文件。在构建它时,我
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post一个问题。 4
首先,我对 Oracle 审计跟踪这件事还很陌生。因此,我必须审核特定用户的操作。 我的问题是,当我检查 dba_fga_audit_trail 时,我在 sql_text 列中看到用户运行了删除语句
我正在使用 nightmare 进行测试。运行 npm audit 后,我收到有关 lodash Prototype pollution 的警告。我尝试通过运行 npm audit fix 来修复
我们正在使用 Audit.NET我们的 Asp.Net Core 项目中的库来记录用户操作。最近我们决定使用Hashicorp Vault安全地存储和获取 secret ,包括 数据库凭据 . Vau
最近,由于授权/审计功能的一些奇怪行为,我的一个生产应用程序开始抛出异常。总而言之,我可以向 channel / key 组合授予权限并获得成功响应,但是当我之后立即审核 channel 时,它会显示
有没有人有一个关于如何将审计模型添加到现有项目的工作示例,用于 Audit.Net。 这是一个非常棒的组件,到目前为止,我和我的团队已经使用标准的 JSON 文件,但是,我们希望将当前的解决方案迁移到
在Hibernate中使用@Version和@Audited时,有人可以帮助我解决用例吗? 最佳答案 @Version用于与Hibernate一起实现Optimistic locking,这意味着没有
我正在尝试使用grails audit-logging插件。它似乎可以满足我的需求。 但是,在为自动生成id的域类引用id时遇到问题。 class Person { static auditable
我正在使用Grails 2.2.2,audit-trail插件2.0.3和spring-security-core 1.2.7.3 当我将注释放在类上并使用浏览器(通过Controller / gsp
我正在尝试在基于kubeadm的k8s上启用审核选项。 (v1.11.2) 但是在--audit-policy-file上添加/etc/kubernetes/manifests/kube-apiser
我将@Audited 注释用于我的基本模型。我将其扩展到我的所有实体。但它不起作用。有什么方法可以使用吗 这是我的基本模型 @MappedSuperclass @Getter @Setter @Aud
我正在使用 Audit.NET 和 EntityFramework 扩展,当我仅跟踪 1 个实体时,一切都运行良好。 现在我正在跟踪连接到第一个实体的另一个实体,当我尝试保存它时,审核保存函数会抛出反
当这个方法在 Controller 中执行时: [Route("deleteIncCloseOut")] [HttpDelete] [AuditApi] public bool deleteIncid
我是一名优秀的程序员,十分优秀!