基于Spring Data的AuditorAware审计功能的示例代码
时间:2019-04-13
本文章向大家介绍基于Spring Data的AuditorAware审计功能的示例代码,主要包括基于Spring Data的AuditorAware审计功能的示例代码使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Spring Data提供支持审计功能:即由谁在什么时候创建或修改实体。Spring Data提供了在实体类的属性上增加@CreatedBy,@LastModifiedBy,@CreatedDate,@LastModifiedDate注解,并配置相应的配置项,即可实现审计功能,有系统自动记录 createdBy CreatedDate lastModifiedBy lastModifiedDate 四个属性的值,下面为具体的配置项。
示例
创建一个实体类
package com.hfcsbc.infrastructureservice.domain; import com.hfcsbc.repository.support.domain.AbstractAuditingEntity; import lombok.Data; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistence.*; import java.util.Date; /** * Create by pengchao on 2018/3/7 */ @Entity @Data @EntityListeners({AuditingEntityListener.class}) public class Person { @Id @GeneratedValue private Long id; private String name; private Integer age; @CreatedBy @Column( name = "created_by", nullable = false, length = 50, updatable = false ) private String createdBy; @CreatedDate @Column( name = "created_date", nullable = false, updatable = false ) private Date createdDate = new Date(); @LastModifiedBy @Column( name = "last_modified_by", length = 50 ) private String lastModifiedBy; @LastModifiedDate @Column( name = "last_modified_date" ) private Date lastModifiedDate = new Date(); }
创建相应的Repository
package com.hfcsbc.repository; import com.hfcsbc.domain.Person; import org.springframework.data.jpa.repository.JpaRepository; /** * Create by pengchao on 2018/3/7 */ public interface PersonRepository extends JpaRepository<Person, Long> { }
配置获取用户信息的bean
package com.hfcsbc.infrastructureservice.config; import org.springframework.data.domain.AuditorAware; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import java.util.Optional; /** * Create by pengchao on 2018/3/7 */ @Component("auditorAware") public class AuditorAwareImpl implements AuditorAware<String> { @Override public Optional<String> getCurrentAuditor() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); return Optional.of(authentication.getPrincipal().toString()); } }
在Spring Boot入口类开启审计功能
package com.hfcsbc.infrastructureservice; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication @EnableJpaAuditing(auditorAwareRef = "auditorAware") @EnableAsync public class PersonApplication { public static void main(String[] args) { SpringApplication.run(PersonApplication.class, args); } }
即完成配置,在使用 repository 保存对象时, createdBy CreatedDate lastModifiedBy lastModifiedDate 有审计功能自动插入
注:在异步方法中如何获取用户信息
由于在异步方法中使用repository保存对象,获取不到用户用户信息,需增加如下配置项,即可在Authentication获取用户的信息
package com.hfcsbc.config; import org.springframework.beans.factory.config.MethodInvokingFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.core.context.SecurityContextHolder; /** * Create by pengchao on 2018/3/7 */ @Configuration public class AuditorAwareConfig { @Bean public MethodInvokingFactoryBean methodInvokingFactoryBean() { MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean(); methodInvokingFactoryBean.setTargetClass(SecurityContextHolder.class); methodInvokingFactoryBean.setTargetMethod("setStrategyName"); methodInvokingFactoryBean.setArguments(new String[]{SecurityContextHolder.MODE_INHERITABLETHREADLOCAL}); return methodInvokingFactoryBean; } }
SecurityContextHolder的主要功能是将当前执行的进程和SecurityContext关联起来。
SecurityContextHolder.MODE_INHERITABLETHREADLOCAL :用于线程有父子关系的情景中,子线程集成父线程的SecurityContextHolder;
SecurityContextHolder.MODE_INHERITABLETHREADLOCAL :全局共用SecurityContextHolder。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- ModelBinder——ASP.NET MVC Model绑定的核心
- 一句代码实现批量数据绑定[下篇]
- 三种属性操作性能比较:PropertyInfo + Expression Tree + Delegate.CreateDelegate
- 解密Myspace密码的姿势
- weblogic安全配置二三事
- 开发自己的Data Access Application Block[下篇]
- 【CSS】格仔背景
- 这年头真的还有USB设备是安全的吗?
- js的动态加载、缓存、更新以及复用(一)使用范围:遇到的问题:目标:页面结构:正文
- js的动态加载、缓存、更新以及复用(二)恼人的命名冲突
- 以【猫叫、老鼠跑、主人醒】为例子,使用 javascript 来实现 观察者模式 (有在线演示)
- Debian/Ubuntu-shell脚本来管理iptables安全策略
- Pegasus间谍套件内部原理及流程剖析
- 用node.js实现ORM的一种思路
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 树莓派基础实验6:轻触开关按键实验
- 从 lsof 开始,深入理解 Linux 虚拟文件系统!
- 原来 8 张图,就可以搞懂「零拷贝」了
- 构造函数没有返回值是怎么赋值的?
- 高频手撕算法合集来了!
- 面试官:兄弟,说说 ArrayList 和 LinkedList 有什么区别
- 开源中文关系抽取框架,来自浙大知识引擎实验室
- EAST+CRNN银行卡号识别,附数据集
- 绝了!搜狗输入法这骚操作!
- Linux 中几个正则表达式的用法
- 产品级垃圾文本分类器
- 突发!Windows XP 源码泄露!
- GitHub 神器:写代码、搜问题,全部都在「终端」完成!
- Redis系列:单机主从模式搭建
- Python 爬取链家成都二手房源信息 asyncio + aiohttp 异步爬虫实战