利用SpringDataJPA开启审计功能可以方便地对每次数据操作进行记录,包括操作人、操作时间等信息。这样做有利于数据追溯和安全性控制。下面是实现该功能的步骤:
- 添加必要的依赖
在项目的pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
- 创建审计类
创建一个名为AuditConfig的类,并把它设置为Spring组件,该类实现了Spring Data JPA提供的JpaAuditingHandler接口。JpaAuditingHandler会在实体保存到数据库时使用Spring Security提供的Authentication获取当前用户信息,然后将其设置到实体对应的审计字段中。
@Configuration
@EnableJpaAuditing
public class AuditConfig implements AuditorAware<String>, JpaAuditingHandler {
@Override
public Optional<String> getCurrentAuditor() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null || !authentication.isAuthenticated()) {
return Optional.of("system");
}
return Optional.of(authentication.getName());
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
super.setBeanFactory(beanFactory);
}
}
其中,getCurrentAuditor()方法用来获取当前用户信息,如果获取不到就返回"system",该方法返回值会由JpaAuditingHandler设置到实体的审计字段中。
- 创建实体类
在数据实体类中添加审计字段,如createdBy、createdAt、lastModifiedBy、lastModifiedDate。
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private Double price;
@CreatedBy
private String createdBy;
@CreatedDate
private Date createdAt;
@LastModifiedBy
private String lastModifiedBy;
@LastModifiedDate
private Date lastModifiedDate;
}
- 集成配置
在应用程序启动入口处添加@EnableJpaAuditing注释,以启用审计功能。
@SpringBootApplication
@EnableJpaAuditing
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- 测试
测试时,在JPA Repository中添加实体数据,可以看到自动添加了当前用户信息以及时间戳。
@Service
@Transactional
public class ProductService {
@Autowired
private ProductRepository productRepository;
public Product saveProduct(Product product) {
return productRepository.save(product);
}
public Iterable<Product> findAll() {
return productRepository.findAll();
}
}
完整示例代码请见:https://github.com/zhancongc/spring-data-jpa-auditing-demo
例如,执行以下代码进行测试:
@Service
public class Demo {
@Autowired
private ProductService productService;
public void execute() {
Product product = new Product();
product.setName("iPhone 13");
product.setPrice(9999.0);
productService.saveProduct(product);
Iterable<Product> products = productService.findAll();
for (Product p : products) {
System.out.println(p.toString());
}
}
}
结果如下:
Product{id=1, name='iPhone 11', price=999.9, createdBy='system', createdAt=Tue Nov 09 10:30:45 CST 2021, lastModifiedBy='system', lastModifiedDate=Tue Nov 09 10:30:45 CST 2021}
Product{id=2, name='iPhone 12', price=1999.9, createdBy='system', createdAt=Tue Nov 09 10:31:18 CST 2021, lastModifiedBy='system', lastModifiedDate=Tue Nov 09 10:31:18 CST 2021}
Product{id=3, name='iPhone 13', price=9999.0, createdBy='system', createdAt=Tue Nov 09 10:31:46 CST 2021, lastModifiedBy='system', lastModifiedDate=Tue Nov 09 10:31:46 CST 2021}
以上就是利用SpringDataJPA开启审计功能、自动保存操作人操作时间的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用SpringDataJPA开启审计功能,自动保存操作人操作时间 - Python技术站