gpt4 book ai didi

java - 如何在异步任务中利用 spring-data-jpa 审计 (AuditorAware)?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:02 26 4
gpt4 key购买 nike

目前,我的 AuditorAware实现使用 Spring 的 SecurityContextHolder检索当前 Auditor 以保存创建/修改用户名:

@Service
public class AuditorAwareImpl implements AuditorAware<UserDetails> {

private final UserDetailsService userDetailsService;

@Autowired
public AuditorAwareImpl(UserDetailsService userDetailsService){
this.userDetailsService = userDetailsService;
}

@Override
public UserDetails getCurrentAuditor() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return userDetailsService.loadUserByUsername(authentication.getName());
}
}

除了由 Spring 批处理的 SimpleAsyncTaskExecutor 执行的异步任务外,这适用于大多数操作.

到实体需要保存时,因为 SecurityContextHolder在处理完请求后被删除,并且 jobLauncher.run(...) 异步返回,AuditorAwareImpl.getCurrentAuditor() 方法抛出一个 NullPointerException 由于 getAuthentication() 为空:

java.lang.NullPointerException: null
at com.example.services.AuditorAwareImpl.getCurrentAuditor(AuditorAwareImpl.java:31)
at com.example.services.AuditorAwareImpl.getCurrentAuditor(AuditorAwareImpl.java:18)

到目前为止,我已将请求调用用户作为作业的非标识参数包括在内,但不知道从哪里开始。

SecurityContextHolder 不适合查找调用“审核员”时,推荐使用 spring 的内置审核的方法是什么?

最佳答案

你可以包装你的 AsyncTaskExecutorDelegatingSecurityContextAsyncTaskExecutor这是专门为传播 Spring SecurityContext 而设计的。此外,您还需要为安全上下文设置 MODE_INHERITABLETHREADLOCAL

关于java - 如何在异步任务中利用 spring-data-jpa 审计 (AuditorAware)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44580608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com