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);
  }
}