Java Future - Spring Authentication is null into AuditorAware
这是我的场景:
我的应用启用了 Mongo 审计,并使用自定义的 AuditorAware 从
我有一个异步方法 (
1 2 3 4 5 6 7 8 9 10 11 12 13 | @Override public User getCurrentAuditor() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication == null || !authentication.isAuthenticated() || authentication instanceof AnonymousAuthenticationToken) { log.error("Not authenticated"); return null; } [...] } |
我正在使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | @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。
1 2 3 4 5 6 7 8 | @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.origas.eu/spring/2010/04/inherit-spring-security-context-in-child-threads
如何设置 Spring Security SecurityContextHolder 策略?
根据对 kuhajeyan 的回答的评论,您似乎没有正确使用
如果您使用例如启动任务
的优点
相反,你应该做的是让 Spring 处理任务执行,并简单地返回一个完整的
1 2 3 4 5 | @Async public CompletableFuture<String> someMethod() { // do some computation, but return a completed future return CompletableFuture.completedFuture("Hello World!"); } |
Spring 将在配置的执行器中异步执行您的方法,同时立即返回一个
如果您使用的是 Spring 4.2 或更高版本,则支持开箱即用。否则需要一些实现,但这将是另一个问题。