package cn.tedu.ff_server.mybatis;
import cn.tedu.ff_server.security.LoginPrincipal;
import cn.tedu.ff_server.security.UserLoginDetails;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*;
import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.util.Objects;
import java.util.Properties;
import org.apache.ibatis.executor.Executor;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}) })
public class AuditingInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
//获取到登录的用户名
LoginPrincipal user = (LoginPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
// 获取一个MappedStatement
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
// 获取SQL命令 UNKNOWN INSERT UPDATE SELECT DELETE
SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
// 获取参数
Object parameter = invocation.getArgs()[1];
if (parameter == null) {
return invocation.proceed();
}
// 获取私有成员变量
Field[] fields = parameter.getClass().getDeclaredFields();
if (SqlCommandType.INSERT.equals(sqlCommandType)) {
for (Field field : fields) {
if ("createName".equals(field.getName())) {
// 插入创建人
field.setAccessible(true);
field.set(parameter, user.getId());
field.setAccessible(false);
}
if ("createTime".equals(field.getName())) {
// 插入创建时间
field.setAccessible(true);
field.set(parameter, LocalDateTime.now());
field.setAccessible(false);
}
}
}
if (SqlCommandType.UPDATE.equals(sqlCommandType) || SqlCommandType.INSERT.equals(sqlCommandType)) {
for (Field field : fields) {
if ("updateName".equals(field.getName())) {
// 插入修改人
field.setAccessible(true);
field.set(parameter, user.getId());
field.setAccessible(false);
}
if ("updateTime".equals(field.getName())) {
// 插入修改时间
field.setAccessible(true);
field.set(parameter, LocalDateTime.now());
field.setAccessible(false);
}
}
}
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
if (target instanceof Executor) {
return Plugin.wrap(target, this);
} else {
return target;
}
}
@Override
public void setProperties(Properties properties) {
Interceptor.super.setProperties(properties);
}
}
网友评论