hello,伙伴们,今天我们一起聊聊操作审计的功能实现,正常来说我们每个系统都会对用户的增删改操作做一些日志记录,防止后续一些操作的追溯或管理员对系统操作信息的管理等。那么今天我们就通过Spring的AOP特性来具体实现。
首先是要记录日志的实体类信息,如下:
public class Record {
/**
* 操作人
*/
private String auditName;
/**
* 操作时间
*/
private String auditTime;
/**
* 操作类型
*/
private String auditType;
/**
* 操作表名
*/
private String tableName;
/**
* 操作描述
*/
private String desc;
//其他需记录信息 依需求添加
}
接下来我们创建注解Audit
@Retention(RetentionPolicy.RUNTIME)
//注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在
@Target(ElementType.METHOD)//用于描述方法
public @interface Audit {
/**
* 表名
*/
String table() default "";
/**
* 审计日志类型 add/delete/update等
*/
AuditType type() default "select";
/**
* 操作说明
*/
String desc() default "";
}
随后创建切面AuditAspect
@Aspect//定义为切面,把当前类标识为一个切面供容器读取
@Component//创建单例对象,交给spring容器管理
public class AuditAspect {
//注入添加日志的业务层service
@Autowired
private RecordService recordService;
//定义切点 (以注解的形式做标识 所有加@Audit注解的业务方法都会执行日志记录信息
@Pointcut("@annotation(cn.annotation.Audit)")
public void logPointCut() {
}
//返回值通知 (业务方法执行完成之后 异步执行操作审计信息)
@AfterReturning("logPointCut()")
public void saveAuditLog(JoinPoint joinPoint){
//获取操作审计注解
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
Method method = signature.getMethod();
Audit audit = method.getAnnotation(Audit.class);
//操作日志入库 异步执行
logRecordService.addLogRecord(audit,joinPoint.getArgs());
}
}
RecordService业务层中异步执行审计日志方法如下:
/**
* 异步添加操作日志记录
* @param audit
* @param args
*/
@Async
public void addLogRecord(Audit audit,Object[] args){
Record logRecord = new Record();
if(Objects.nonNull(audit)&&!"select".equals(audit.type())){
logRecord.setAuditTime(LocalDateTime.now().toString(STANDARD_FORMAT));
logRecord.setAuditType(audit.type());
logRecord.setTableName(audit.table());
logRecord.setName(getUserName());
}
JSONArray jsonObject = new JSONArray(args);
logRecord.setDesc(jsonObject.toString());
logRecord.setId(getNextId());
recordRepository.save(logRecord);
}
接下来我们在更新用户信息的接口上面加上该注解 ,修改下用户信息看看是否将操作日志信息入库:
/**
* @Description: 修改用户信息
* @param: user
* @return: void
*/
@Audit(type = "update",table = "user")
public void updateUser(User user) {
/**
* 修改用户信息逻辑
*/
user.setFullName("张三");
userRepository.update(user);
}
可以看出修改用户的日志记录已经添加到数据表中。这就是基于Spring AOP简单实现的操作审计功能,伙伴们 会用了嘛 我们下期见!