`
wiselyman
  • 浏览: 2093808 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
博客专栏
Group-logo
点睛Spring4.1
浏览量:82320
74ae1471-94c5-3ae2-b227-779326b57435
点睛Spring MVC4...
浏览量:130780
社区版块
存档分类
最新评论

基于Spring Data的AuditorAware审计功能

 
阅读更多

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

示例

创建一个实体类

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保存对象时,createdByCreatedDatelastModifiedBylastModifiedDate有审计功能自动插入

注:在异步方法中如何获取用户信息

由于在异步方法中使用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。

 

源码地址:http://www.wisely.top/2018/03/08/spring-data-auditoraware/

0
0
分享到:
评论

相关推荐

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

    基于Spring Data的AuditorAware审计功能的示例代码 Spring Data提供了AuditorAware审计功能,以记录实体的创建和修改信息。AuditorAware是一个Spring Data提供的接口,用于提供当前用户的信息,以便在实体类中记录...

    Spring Data JPA中文文档[1.4.3]_springdatajpa_erlang_waitxpf_

    5. **Auditing**:Spring Data JPA 提供了审计功能,可以自动记录实体的创建时间和修改时间。这可以通过 `@CreatedDate` 和 `@LastModifiedDate` 注解实现。 6. **Integration with Spring MVC**:Spring Data JPA ...

    Spring Data JPA 笔记

    6. ** auditing**:Spring Data JPA还提供了审计功能,通过`@CreationTimestamp`和`@LastModifiedDate`注解,可以自动记录实体创建和修改的时间。 7. **分页和排序**:`Pageable`接口提供了分页和排序的支持,可以...

    Spring Data MongoDB中文文档

    通过 Spring Data MongoDB,开发者可以利用 Spring 的强大功能轻松地进行 NoSQL 数据库的操作。 - **Spring Data MongoDB** 的设计目标是简化开发者的开发流程,通过提供一种统一的方式与不同的数据存储系统进行交互...

    Spring Data MongoDB API(Spring Data MongoDB 开发文档).CHM

    Spring Data MongoDB API。 Spring Data MongoDB 开发文档。

    Java进阶教程数据层全栈方案SpringData高级应用视频教程

    本次课程以SpringData为中心,重点讲解了其JPA组件,扩展讲解了redis,mongDB,ES组件,并且对部分组件做了必要的源码分析。而且在课程的最后部分加入了一个综合案例,可以将前面章节所学知识点应用到一个项目中,帮助...

    Spring Data JPA Spring Data Commons

    Spring Data JPA是Spring框架的一部分,它是一种简便的数据访问层(Repository)的实现技术,主要用来简化JPA(Java Persistence API)实体数据访问代码的编写。Spring Data JPA允许开发者通过简单的接口和注解配置...

    基于SpringBoot+Spring Data JPA+mybatis的仓库管理系统.zip

    基于SpringBoot+Spring Data JPA+mybatis的仓库管理系统 基于SpringBoot+Spring Data JPA+mybatis的仓库管理系统 基于SpringBoot+Spring Data JPA+mybatis的仓库管理系统 基于SpringBoot+Spring Data JPA+mybatis的...

    SpringData视频教学

    1. 尚硅谷_SpringData_概述 2. 尚硅谷_SpringData_HelloWorld 3. 尚硅谷_SpringData_Repository接口 4. 尚硅谷_SpringData_Repository查询方法定义规范 5. 尚硅谷_SpringData_Query注解 6. 尚硅谷_SpringData_...

    基于Spring Data JPA的待办事项管理系统.zip

    基于Spring Data JPA的待办事项管理系统 项目简介 本项目是一个基于Spring Data JPA框架的待办事项管理系统,旨在提供一个简单而强大的工具来管理待办事项。项目通过Spring Data JPA与数据库进行交互,支持事务...

    Spring Data Commons 2.0.x_2.0.0.M2

    9. 审计:Spring Data Commons支持对数据访问操作进行审计跟踪,文档介绍了基于注解和基于接口的审计元数据,以及如何配置AuditorAware来确定当前审计者信息。 附录部分包括了命名空间引用、Populators命名空间引用...

    基于SpringBoot+Spring Data JPA+mybatis的仓库管理系统源码.zip

    1、基于SpringBoot+Spring Data JPA+mybatis的仓库管理系统源码.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考...

    尚硅谷SpringData视频观看下载链接

    SpringData Redis提供了对Redis内存数据存储的访问,用于缓存、消息队列等功能。关键特性有: - 提供RedisTemplate和ReactiveRedisTemplate,用于同步和响应式操作。 - 支持多种数据结构,如字符串、列表、集合、...

    Spring Data Neo4j API(Spring Data Neo4j 开发文档).CHM

    官网 Spring Data Neo4j API。 Spring Data Neo4j 开发文档。 Spring Data Neo4j API

    Spring Data JPA的优点和难点.pdf

    Spring Data JPA是Spring生态中的一个强大ORM框架,它极大地提高了Java开发者在处理数据库操作时的效率。Spring Data JPA的主要优点在于其高度的开发效率、成熟的语法结构以及与Spring框架的紧密集成。 1. **开发...

    SpringDataRedis的jar包.rar

    5. **Redis Repositories**:Spring Data的Repository抽象层扩展到了Redis,允许开发者定义基于注解的查询方法,如`findAll()`, `findById()`, `save()`等,极大地简化了数据访问代码。 6. **事务支持**:虽然Redis...

    SpringData入门到精通

    在“HelloWorld”阶段,你将了解如何配置SpringData项目,创建Repository接口,并实现简单的数据查询功能。 SpringData的主要组件包括: 1. **SpringData JPA**:用于处理关系型数据库,如MySQL、Oracle等。它提供...

    spring-data-jest, Jest的Spring Data 实现.zip

    spring-data-jest, Jest的Spring Data 实现 Spring Data Jest 基于on客户端的ElasticSearch的Spring Data 实现仅在 HTTP ( 例如AWS上) 可以访问的情况下使用 Spring Data 和ElasticSearch群集。

    spring data实战源码

    《Spring Data实战源码》是基于Spring Data框架的一本深入解析书籍,其随书源码提供了丰富的示例和实践案例,帮助读者理解Spring Data的核心概念和技术。Spring Data是一个强大的库,旨在简化数据库访问并增强数据...

    Spring Data JPA从入门到精通

    3. **Spring Data JPA概述**:Spring Data JPA是Spring对JPA的扩展,它提供了自动化的数据访问层,包括查询方法的自动实现、Repository接口的定义以及定制化查询等功能。 4. **Repository接口**:Spring Data JPA的...

Global site tag (gtag.js) - Google Analytics