Java Future - Spring Authentication 在 AuditorAware 中为空

标签 java spring mongodb spring-security completable-future

这是我的场景:

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

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

@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 安全上下文始终绑定(bind)到 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

How to set up Spring Security SecurityContextHolder strategy?

关于Java Future - Spring Authentication 在 AuditorAware 中为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40345643/

相关文章:

java - Spring MVC : Advanced annotation based mapping

java - 无法捕获异常

java - Eclipse 使用正则表达式查找/替换整行

将 C 与 MongoDB 连接

javascript - 如何使用mongoose从mongoDB中获取一定数量的对象? ( Node .js)

java - 重命名所有变量和方法名称的脚本或工具有什么建议吗?

spring - 如何使用 header-filter 删除 spring 集成中的 header 值?

java - apache 中没有错误,但出现 404 错误

java - 使用 Hibernate 和 Spring 以及 SQLServer 的无效对象名称 'tableName'

node.js - Heroku 自定义域不起作用