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

目录
  • 1 相关注解
    • 实现自动记录上述信息主要有5个注解
  • 2 实现过程
    • 2.1 依赖引用
    • 2.2 实体类标记审计属性
    • 2.3 审计自定义操作
    • 2.4 应用开启审计功能
    • 2.5 实体操作

有些业务数据对数据的创建、最后更新时间以及创建、最后操作人进行记录。如果使用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类进行保存时,系统会自动记录数据的审计属性值。

最终效果如下:

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

(0)

相关推荐

  • Spring Data JPA的Audit功能审计数据库的变更

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 数据库审计 数据库审计是指当数据库有记录变更时,可以记录数据库的变更时间和变更人等,这样以后出问题回溯问责也比较方便.对于审计表记录的变更可以两种方式,一种是建立一张审计表专门用于记录,另一种是在数据库增加字段.本文所讨论的是第二种方案. 那如何在新增.修改.删除的时候同时增加记录呢?如果每张表都单独记录,代码就会显得很冗余.更好的方式应该是做切面或者事件监听,当数据有变更时统一进行记录. 2 Spring Dat

  • 基于Spring Data的AuditorAware审计功能的示例代码

    Spring Data提供支持审计功能:即由谁在什么时候创建或修改实体.Spring Data提供了在实体类的属性上增加@CreatedBy,@LastModifiedBy,@CreatedDate,@LastModifiedDate注解,并配置相应的配置项,即可实现审计功能,有系统自动记录 createdBy CreatedDate lastModifiedBy lastModifiedDate 四个属性的值,下面为具体的配置项. 示例 创建一个实体类 package com.hfcsbc.i

  • 解析Spring Data JPA的Audit功能之审计数据库变更

    一.数据库审计 数据库审计是指当数据库有记录变更时,可以记录数据库的变更时间和变更人等,这样以后出问题回溯问责也比较方便.对于审计表记录的变更可以两种方式,一种是建立一张审计表专门用于记录,另一种是在数据库增加字段.本文所讨论的是第二种方案. 那如何在新增.修改.删除的时候同时增加记录呢?如果每张表都单独记录,代码就会显得很冗余.更好的方式应该是做切面或者事件监听,当数据有变更时统一进行记录. 二.Spring Data JPA审计 Spring Data JPA为我们提供了方便的Audit功能

  • spring jpa 审计功能自定义填充字段方式

    目录 spring jpa 审计功能自定义填充字段 有两种方式 具体步骤 启用Spring Data JPA审计功能 JPA Audit 说明 如何使用审计功能 1.编写AuditorAware 2.在实体类中声明@EntityListeners和相应的注解 3.在Application 中启用审计@EnableJpaAuditing spring jpa 审计功能自定义填充字段 spring data jpa 通过@CreateBy等注解实现了审计功能(在新建或者修改的时候自动填充某些字段)

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

    目录 1 相关注解 实现自动记录上述信息主要有5个注解 2 实现过程 2.1 依赖引用 2.2 实体类标记审计属性 2.3 审计自定义操作 2.4 应用开启审计功能 2.5 实体操作 有些业务数据对数据的创建.最后更新时间以及创建.最后操作人进行记录.如果使用Spring Data Jpa做数据新增或更新,可实现自动保存这些信息而不需要显示设置对应字段的值,可通过以下步骤进行配置. 1 相关注解 实现自动记录上述信息主要有5个注解 @EnableJpaAuditing:审计功能开关 @Creat

  • pycharm软件实现设置自动保存操作

    pycharm一般安装完毕,就是默认是自动保存的,但是......但是....既然是程序,既然是软件,就难免出现bug.也许会有码友出现头天晚上写好的代码,打开一看,第二天白花花一片!!!泪奔有没有 最简单的,就是每次编写完毕,习惯按 ctrl + s 手动保存. 但是,提醒你务必检查一下你的设置里面,是不是码友弄好自动保存! 步骤如下: 菜单File -> Settings... -> Appearance & Behavior -> System Settings 记住勾上2

  • PHP利用Cookie设置用户30分钟未操作自动退出功能

    登陆控制器需要做的登陆成功把用户ID等信息存入cookie: $this->systemSetKey(array('name'=>$admin_info['admin_name'], 'id'=>$admin_info['admin_id'],'gid'=>$admin_info['admin_gid'],'sp'=>$admin_info['admin_is_super']));//登陆成功之后做得事情 父类中的 systemSetKey 方法: /** * 系统后台 会员

  • mysql利用init-connect增加访问审计功能的实现

    mysql的连接首先都是要通过init-connect初始化,然后连接到实例. 我们利用这一点,通过在init-connect的时候记录下用户的thread_id,用户名和用户地址实现db的访问审计功能. 实现步骤 1.创建审计用的库表. 为了不与业务的库冲突,单独创建自己的库: #建库表代码 create database db_monitor ; use db_monitor ; CREATE TABLE accesslog ( thread_id int(11) DEFAULT NULL,

  • 图片自动保存到本地并利用aspjpeg为图片加水印

    <% '函数功能:远程图片自动保存到本地服务器,并利用aspjpeg为图片加上水印 '(注意:请先在目录下创建images目录,用来保存临时图片) '本程序需要在服务器上安装"aspjpeg组件"否则无法正常使用 '也可以只取'''''22222222'''''''以上的部分,这部分可以保存图片,第二部分是进行水印增加 '使用方法,请保存为saveimg.asp 'saveimg.asp?url=http://siyizhu.com/logo.gif 即可以取下图片啦,HOHO.

  • 快速关闭android studio的自动保存功能教程

    1.进入设置:File > Settings. 2.去掉红框两处勾选. Save files on frame deactivation Save files automatically if application is idle 3.勾选红框处的选项. Mark modified tabs with asterisk 4.可更改保存的快捷键. 默认情况下,Android Studio 的 Ctrl+S 是保存所有修改的文件,我觉得挺好的.所以我没改. 如果想 Ctrl+S 只保存当前文件,可

  • 禁用WordPress的自动保存草稿文章修订功能方法详解

    WordPress的版本修订历史(revision).自动保存(autosave)和自动草稿(auto-draft)功能会非常讨厌的增加文章ID的数字,会造成连续的两篇文章,ID数值可能会相差很多,让我们这些希望文章ID连续的人感到非常不舒服 那么我们如何禁用WordPress版本修订历史,禁用WordPress自动保存,禁用WordPress自动草稿功能呢? 下面的方法需要修改源文件所以在打开每一个文件之前,记得一定要先做好备份! 禁用WordPress文章修订历史版本 1.打开 wp-con

  • iOS实现视频下载并自动保存到相册功能

    iOS视频下载功能实现,并自动保存到相册(有MBProgressHUD 可以解开注释),供大家参考,具体内容如下 视频类定义属性 ///@property (nonatomic,strong) MBProgressHUD *hud; @property (nonatomic,strong) NSURLSession *session; ///视频播放和下载用的url @property (nonatomic,strong) NSURL *url; ///初始化session - (NSURLSe

随机推荐