利用SpringDataJPA开启审计功能,自动保存操作人操作时间

 更新时间:2021年12月21日 11:26:54   作者:晴空排云  
这篇文章主要介绍了利用SpringDataJPA开启审计功能,自动保存操作人操作时间,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

有些业务数据对数据的创建、最后更新时间以及创建、最后操作人进行记录。如果使用Spring Data Jpa做数据新增或更新,可实现自动保存这些信息而不需要显示设置对应字段的值,可通过以下步骤进行配置。

1 相关注解

实现自动记录上述信息主要有5个注解

  • @EnableJpaAuditing:审计功能开关
  • @CreatedBy:标记数据创建者属性
  • @LastModifiedBy:标记数据最近一次修改者属性
  • @CreatedDate:标记数据创建日期属性
  • @LastModifiedDate:标记数据最近一次修改日期属性

2 实现过程

2.1 依赖引用

使用Spring Data JPA要引用依赖spring-boot-starter-data-jpa,gradle引用方式如下

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

2.2 实体类标记审计属性

案例使用User实体演示过程,需要在实体对应的字段上添加对应的注解表示是审计属性,另外需要在实体类上开启审计监听,如下:

@Entity
@Table(name = "h_user")
@EntityListeners({AuditingEntityListener.class})//开启审计监听
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    //保存创建人的字段
    @CreatedBy
    @Column(name = "created_by")
    private String createdBy;
    //保存最近修改人的字段
    @LastModifiedBy
    @Column(name = "last_modified_by")
    private String lastModifiedBy;
    //保存创建时间的字段
    @CreatedDate
    @Column(name = "created_date")
    //保存最近修改日期的字段
    private Date createdDate;
    @LastModifiedDate
    @Column(name = "last_modified_date")
    private Date lastModifiedDate;
    private String realName;
    private String username;
    private String mobile;
    private String email;
    private String password;
    private Integer flag;
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getCreatedBy() {
        return createdBy;
    }
    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }
    public String getLastModifiedBy() {
        return lastModifiedBy;
    }
    public void setLastModifiedBy(String lastModifiedBy) {
        this.lastModifiedBy = lastModifiedBy;
    }
    public Date getCreatedDate() {
        return createdDate;
    }
    public void setCreatedDate(Date createdDate) {
        this.createdDate = createdDate;
    }
    public Date getLastModifiedDate() {
        return lastModifiedDate;
    }
    public void setLastModifiedDate(Date lastModifiedDate) {
        this.lastModifiedDate = lastModifiedDate;
    }
    
    public String getRealName() {
        return this.realName;
    }
    public void setRealName(String realName) {
        this.realName = realName;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getMobile() {
        return mobile;
    }
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    @JsonIgnore
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Integer getFlag() {
        return flag;
    }
    public void setFlag(Integer flag) {
        this.flag = flag;
    }
}

上述User实体对应数据表定义如下:

create table h_user
(
 id int auto_increment primary key,
 username varchar(30) default '' not null comment '登录用户名',
 real_name varchar(30) default '' null comment '真实姓名',
 mobile varchar(25) default '' null comment '手机号码',
 email varchar(30) default '' null comment '邮箱',
 password varchar(100) default '' null comment '加密密码',
 flag int default '0' null comment '用户标记',
 created_by varchar(50) default 'HSystem' null comment '创建人',
 created_date datetime default CURRENT_TIMESTAMP not null,
 last_modified_by varchar(30) default 'HSystem' null comment '修改人',
 last_modified_date datetime default CURRENT_TIMESTAMP not null,
 constraint user_username_uindex unique (username)
)
engine=InnoDB;

2.3 审计自定义操作

当对实体有新增或保存操作时,系统会自动获取操作时的系统时间作为创建时间和修改时间。

对于创建者或最后修改这,审计过程会获取当前登录系统的用户信息,当未登录的情况下,需要指定默认操作,可通过实现AuditorAware类来实现。

下面代码在未获取到用户信息时返回HSystem表示默认为系统操作。

@Configuration
public class SpringSecurityAuditorAware implements AuditorAware<String> {
    final Logger logger = LoggerFactory.getLogger(this.getClass());
    @Override
    public Optional<String> getCurrentAuditor() {
        try {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            if (authentication instanceof AnonymousAuthenticationToken) {
                return Optional.of("HSystem");
            } else {
                if (authentication == null) {
                    return Optional.of("HSystem");
                }
                User user = (User) authentication.getPrincipal();
                return Optional.of(user.getUsername());
            }
        } catch (Exception ex) {
            logger.error("get user Authentication failed: " + ex.getMessage(), ex);
            return Optional.of("HSystem");
        }
    }
}

2.4 应用开启审计功能

在应用程序入口类添加注解@EnableJpaAuditing开启审计功能,如下

@SpringBootApplication
//启用JPA审计功能,自动填充@CreateDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy注解的字段
@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware")
public class HBackendApplication {
    public static void main(String[] args) {
        SpringApplication.run(HBackendApplication.class, args);
    }
}

注意:如果系统中有多个审计实现,需要指定Bean的名称,上面案例中使用名称为springSecurityAuditorAware的bean。

2.5 实体操作

定义User实体类的JPA操作接口UserRepository如下

@Repository
public interface UserRepository extends PagingAndSortingRepository<User, Integer>, JpaRepository<User, Integer> {
}

例如创建用户时代码如下,不需要显示设置上面提到的4个属性

User user = new User();
user.setUsername(username.trim());
user.setPassword(this.passwordEncoder.encode(password));
user.setEmail("crane.liu@qq.com");
user.setFlag(0);
user.setMobile("18988888888");
user.setRealName(username);
this.userRepository.save(user);

当使用UserRepository对User类进行保存时,系统会自动记录数据的审计属性值。

最终效果如下:

在这里插入图片描述

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring mvc拦截器实现原理解析

    Spring mvc拦截器实现原理解析

    这篇文章主要介绍了Spring mvc拦截器实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • spring webflux响应式编程使用详解

    spring webflux响应式编程使用详解

    webflux,即响应式编程,响应式编程是一种用于处理异步数据流和事件的编程范式,spring webflux是spring在5.0版本后提供的一套响应式编程风格的web开发框架,本文给大家详细讲讲spring webflux响应式编程的使用,需要的朋友可以参考下
    2023-10-10
  • java向文件中追加内容与读写文件内容源码实例代码

    java向文件中追加内容与读写文件内容源码实例代码

    这篇文章主要介绍了java向文件中追加内容与读写文件内容源码实例代码的相关资料,需要的朋友可以参考下
    2017-04-04
  • Java项目在Idea中开发遇到所有代码爆红的问题与解决办法

    Java项目在Idea中开发遇到所有代码爆红的问题与解决办法

    今天打开项目时发现idea竟然爆红,通过查找相关资料用于解决,下面这篇文章主要给大家介绍了关于Java项目在Idea中开发遇到所有代码爆红的问题与解决办法的相关资料,需要的朋友可以参考下
    2023-06-06
  • spring boot上传文件出错问题如何解决

    spring boot上传文件出错问题如何解决

    这篇文章主要介绍了spring boot上传文件出错问题如何解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Maven打包所有依赖到一个可执行jar中遇到的问题

    Maven打包所有依赖到一个可执行jar中遇到的问题

    这篇文章主要给大家介绍了关于Maven打包所有依赖到一个可执行jar中遇到的问题,将依赖打入jar包,由于maven管理了所有的依赖,所以将项目的代码和依赖打成一个包对它来说是顺理成章的功能,需要的朋友可以参考下
    2023-10-10
  • java设计模式笔记之装饰模式

    java设计模式笔记之装饰模式

    这篇文章主要为大家详细介绍了java设计模式笔记之装饰模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • Java 中的 xx ≠ null 是什么新语法

    Java 中的 xx ≠ null 是什么新语法

    Java中null是一个关键字,用来标识一个不确定的对象。因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。本文给大家分享Java 中的 xx ≠ null 是什么新语法,感兴趣的朋友一起看看吧
    2021-06-06
  • Java源码解析之object类

    Java源码解析之object类

    前些天看到别人讨论阅读源码有什么用这个问题,有一句话说的特别好:学习别人实现某个功能的设计思路,来提高自己的编程水平。本文主要介绍了Java源码解析之object类,需要的朋友可以参考。
    2017-10-10
  • Spring Cloud Alibaba Nacos两种检查机制

    Spring Cloud Alibaba Nacos两种检查机制

    这篇文章主要介绍了Spring Cloud Alibaba Nacos两种检查机制,作为注册中心不止提供了服务注册和服务发现功能,它还提供了服务可用性监测的机制,下面我们就一起进入文章了解具体详情吧
    2022-05-05

最新评论