Spring Data提供支持審計功能:即由誰在什麼時候創建或修改實體。 Spring Data提供了在實體類的屬性上增加@CreatedBy,@LastModifiedBy,@CreatedDate,@LastModifiedDate註解,並配置相應的配置項,即可實現審計功能,有系統自動記錄createdBy CreatedDate lastModifiedBy lastModifiedDate 四個屬性的值,下面為具體的配置項。
示例
創建一個實體類
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")@EnableAsyncpublic class PersonApplication { public static void main(String[] args) { SpringApplication.run(PersonApplication.class, args); }}即完成配置,在使用repository 保存對象時, createdBy CreatedDate lastModifiedBy lastModifiedDate 有審計功能自動插入
注:在異步方法中如何獲取用戶信息
由於在異步方法中使用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 */@Configurationpublic 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。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。