Springの@Async先にSecurityContextを引き継ぐ
DelegatingSecurityContextAsyncTaskExecutor (Spring Security 4.0.4.RELEASE API) を使えば実現できるっぽい。 ので AsyncConfigurer を実装したらちゃんと動いた。
import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.security.task.DelegatingSecurityContextAsyncTaskExecutor; @Configuration public class AsyncConfig implements AsyncConfigurer { private final ThreadPoolTaskExecutor defaultSpringBootThreadPoolTaskExecutor; public AsyncConfig(ThreadPoolTaskExecutor defaultSpringBootThreadPoolTaskExecutor) { this.defaultSpringBootThreadPoolTaskExecutor = defaultSpringBootThreadPoolTaskExecutor; } @Override public Executor getAsyncExecutor() { return new DelegatingSecurityContextAsyncTaskExecutor(defaultSpringBootThreadPoolTaskExecutor); } }