Java 未来 - Spring 身份验证在 AuditorAware 中为空

2023-11-23

这是我的场景:

我的应用程序启用了 Mongo Auditing,并带有自定义 AuditorAware,它可以从SecurityContext。这适用于同步方法,并且当前审核员已成功保存,但我无法使其正常工作@Async方法。

我有一个异步方法(CompletableFuture)对我的 Mongo 数据库进行了一些更新。当。。。的时候AuditorAware.getCurrentAuditor()被调用,不存在身份验证信息,并且我无法获取当前审核员(SecurityContextHolder.getContext().getAuthentication()回报null).

@Override
public User getCurrentAuditor() {
   Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

   if (authentication == null || !authentication.isAuthenticated()
                || authentication instanceof AnonymousAuthenticationToken) {
            log.error("Not authenticated");
            return null;
    }

    [...]

}

我正在使用一个DelegatingSecurityContextAsyncTaskExecutor:

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(20);
        executor.setMaxPoolSize(100);
        executor.setQueueCapacity(200);
        executor.initialize();

        return new DelegatingSecurityContextAsyncTaskExecutor(executor);
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new ItacaExceptionHandler();
    }

} 

我怎样才能让它正常工作?


Spring 安全上下文始终绑定到 Threadlocal。

您可能还可以为安全上下文设置 MODE_INHERITABLETHREADLOCAL。

@Bean
public MethodInvokingFactoryBean methodInvokingFactoryBean() {
    MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean();
    methodInvokingFactoryBean.setTargetClass(SecurityContextHolder.class);
    methodInvokingFactoryBean.setTargetMethod("setStrategyName");
    methodInvokingFactoryBean.setArguments(new String[]{SecurityContextHolder.MODE_INHERITABLETHREADLOCAL});
    return methodInvokingFactoryBean;
}

http://www.ogrigas.eu/spring/2010/04/inherit-spring-security-context-in-child-threads

如何设置Spring Security SecurityContextHolder策略?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 未来 - Spring 身份验证在 AuditorAware 中为空 的相关文章

随机推荐