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@EnableAsyncpublic 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.