diff --git a/web/src/main/java/org/springframework/security/web/context/request/async/SecurityContextCallableProcessingInterceptor.java b/web/src/main/java/org/springframework/security/web/context/request/async/SecurityContextCallableProcessingInterceptor.java index d9e04372c3..2b27422025 100644 --- a/web/src/main/java/org/springframework/security/web/context/request/async/SecurityContextCallableProcessingInterceptor.java +++ b/web/src/main/java/org/springframework/security/web/context/request/async/SecurityContextCallableProcessingInterceptor.java @@ -29,7 +29,7 @@ import org.springframework.web.context.request.async.CallableProcessingIntercept * A {@link CallableProcessingInterceptor} that establishes the injected {@link SecurityContext} on the * {@link SecurityContextHolder} when {@link #preProcess(NativeWebRequest, Callable)} is invoked. It also clear out the * {@link SecurityContextHolder} by invoking {@link SecurityContextHolder#clearContext()} in the - * {@link #afterCompletion(NativeWebRequest, Callable)} method. + * {@link #postProcess(NativeWebRequest, Callable, Object)} method. *

* * @author Rob Winch @@ -64,13 +64,13 @@ public final class SecurityContextCallableProcessingInterceptor extends Callable } @Override - public void afterCompletion(NativeWebRequest request, Callable task) throws Exception { - SecurityContextHolder.clearContext(); + public void preProcess(NativeWebRequest request, Callable task) throws Exception { + SecurityContextHolder.setContext(securityContext); } @Override - public void preProcess(NativeWebRequest request, Callable task) throws Exception { - SecurityContextHolder.setContext(securityContext); + public void postProcess(NativeWebRequest request, Callable task, Object concurrentResult) throws Exception { + SecurityContextHolder.clearContext(); } private void setSecurityContext(SecurityContext securityContext) { diff --git a/web/src/test/java/org/springframework/security/web/context/request/async/SecurityContextCallableProcessingInterceptorTests.java b/web/src/test/java/org/springframework/security/web/context/request/async/SecurityContextCallableProcessingInterceptorTests.java index 0f8c107380..541f8b2eff 100644 --- a/web/src/test/java/org/springframework/security/web/context/request/async/SecurityContextCallableProcessingInterceptorTests.java +++ b/web/src/test/java/org/springframework/security/web/context/request/async/SecurityContextCallableProcessingInterceptorTests.java @@ -59,7 +59,7 @@ public class SecurityContextCallableProcessingInterceptorTests { interceptor.preProcess(webRequest, callable); assertThat(SecurityContextHolder.getContext()).isSameAs(securityContext); - interceptor.afterCompletion(webRequest, callable); + interceptor.postProcess(webRequest, callable, null); assertThat(SecurityContextHolder.getContext()).isNotSameAs(securityContext); } @@ -71,7 +71,7 @@ public class SecurityContextCallableProcessingInterceptorTests { interceptor.preProcess(webRequest, callable); assertThat(SecurityContextHolder.getContext()).isSameAs(securityContext); - interceptor.afterCompletion(webRequest, callable); + interceptor.postProcess(webRequest, callable, null); assertThat(SecurityContextHolder.getContext()).isNotSameAs(securityContext); } } diff --git a/web/src/test/java/org/springframework/security/web/context/request/async/WebAsyncManagerIntegrationFilterTests.java b/web/src/test/java/org/springframework/security/web/context/request/async/WebAsyncManagerIntegrationFilterTests.java index 33d6740b1b..ddf368fc85 100644 --- a/web/src/test/java/org/springframework/security/web/context/request/async/WebAsyncManagerIntegrationFilterTests.java +++ b/web/src/test/java/org/springframework/security/web/context/request/async/WebAsyncManagerIntegrationFilterTests.java @@ -31,7 +31,9 @@ import org.springframework.core.task.SimpleAsyncTaskExecutor; import org.springframework.mock.web.MockFilterChain; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.async.AsyncWebRequest; +import org.springframework.web.context.request.async.CallableProcessingInterceptorAdapter; import org.springframework.web.context.request.async.WebAsyncManager; import org.springframework.web.context.request.async.WebAsyncUtils; @@ -84,6 +86,13 @@ public class WebAsyncManagerIntegrationFilterTests { @Test public void doFilterInternalRegistersSecurityContextCallableProcessor() throws Exception { SecurityContextHolder.setContext(securityContext); + asyncManager.registerCallableInterceptors(new CallableProcessingInterceptorAdapter() { + @Override + public void postProcess(NativeWebRequest request, Callable task, Object concurrentResult) + throws Exception { + assertThat(SecurityContextHolder.getContext()).isNotSameAs(securityContext); + } + }); filter.doFilterInternal(request, response, filterChain); VerifyingCallable verifyingCallable = new VerifyingCallable(); @@ -95,6 +104,13 @@ public class WebAsyncManagerIntegrationFilterTests { @Test public void doFilterInternalRegistersSecurityContextCallableProcessorContextUpdated() throws Exception { SecurityContextHolder.setContext(SecurityContextHolder.createEmptyContext()); + asyncManager.registerCallableInterceptors(new CallableProcessingInterceptorAdapter() { + @Override + public void postProcess(NativeWebRequest request, Callable task, Object concurrentResult) + throws Exception { + assertThat(SecurityContextHolder.getContext()).isNotSameAs(securityContext); + } + }); filter.doFilterInternal(request, response, filterChain); SecurityContextHolder.setContext(securityContext);