비동기 호출에서 보안 컨텍스트에 액세스하려는 경우 아래와 같이 스레드를 만들 때 컨텍스트 인식 스레드 풀 실행 프로그램을 구현하여 보안 컨텍스트를 저장할 수 있습니다.
public class CustomExecutor extends ThreadPoolTaskExecutor { @Override public <T> Future<T> submit(Callable<T> task) { return super.submit(new ScopeAwareCallable<T>(task, SecurityContextHolder.getContext())); } }
public class ScopeAwareCallable<T> implements Callable<T> {
private Callable<T> callableTask;
private SecurityContext securityContext;
public ScopeAwareCallable(Callable<T> task, SecurityContext secContex) {
this.callableTask = task;
this.securityContext = secContex;
}
@Override
public T call() throws Exception {
if(securityContext != null){
SecurityContextHolder.setContext(securityContext);
}
try {
return callableTask.call();
}
finally {
SecurityContextHolder.clearContext();
}
}
}이 스프링 구성에서 작업 실행과 같은
구성합니다. Callable 대신 Runnable를 사용하는 경우 Runnable 실행을 지원하는 ThreadPoolTaskExecutor의 다른 메서드도 재정의합니다.
http://stackoverflow.com/questions/3467918/how-to-set-up-spring-security-securitycontextholder-strategy를 참조하십시오. – Ritesh