0 Tage Serie
java / intermediate
Snippet

Übertragen des SecurityContexts über asynchrone Threads hinweg mit DelegatingSecurityContextAsyncTaskExecutor

Standardmäßig speichert Spring Security Authentifizierungsdaten in einem `ThreadLocal` (`MODE_THREADLOCAL`). Daher verlieren asynchrone Hintergrund-Threads, die über `@Async` aufgerufen werden, den Zugriff auf den aktuellen `SecurityContext`. Das Kapseln des Task-Executors in einen `DelegatingSecurityContextAsyncTaskExecutor` stellt sicher, dass Schnappschüsse des Sicherheitskontexts vor der Ausführung transparent an die Worker-Threads übergeben und danach bereinigt werden.

snippet.java
java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Configuration
@EnableAsync
public class AsyncSecurityConfig {
@Bean(name = "securityAwareExecutor")
public AsyncTaskExecutor securityAwareExecutor() {
ThreadPoolTaskExecutor delegate = new ThreadPoolTaskExecutor();
delegate.setCorePoolSize(4);
delegate.setMaxPoolSize(16);
delegate.setQueueCapacity(100);
delegate.setThreadNamePrefix("secure-async-");
delegate.initialize();
return new DelegatingSecurityContextAsyncTaskExecutor(delegate);
}
}
spring
Erklärung
1
@EnableAsync
Aktiviert die asynchrone Methodenausführung von Spring im gesamten Anwendungskontext.
2
ThreadPoolTaskExecutor delegate = new ThreadPoolTaskExecutor();
Konfiguriert den zugrundeliegenden Standard-Thread-Pool mit Poolgrößen und Warteschlangenkapazität.
3
return new DelegatingSecurityContextAsyncTaskExecutor(delegate);
Dekoriert den Executor, sodass übergebene Runnables und Callables den SecurityContext des Aufrufers in den Worker-Thread kopieren.