diff --git a/web/src/main/java/org/springframework/security/web/context/HttpSessionSecurityContextRepository.java b/web/src/main/java/org/springframework/security/web/context/HttpSessionSecurityContextRepository.java index a22f7ccaae..2563d1f20e 100644 --- a/web/src/main/java/org/springframework/security/web/context/HttpSessionSecurityContextRepository.java +++ b/web/src/main/java/org/springframework/security/web/context/HttpSessionSecurityContextRepository.java @@ -269,8 +269,9 @@ public class HttpSessionSecurityContextRepository implements SecurityContextRepo logger.debug("SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession."); } - if (httpSession != null) { + if (httpSession != null && !contextObject.equals(contextBeforeExecution)) { // SEC-1587 A non-anonymous context may still be in the session + // SEC-1735 remove if the contextBeforeExecution was not anonymous httpSession.removeAttribute(springSecurityContextKey); } return; diff --git a/web/src/test/java/org/springframework/security/web/context/HttpSessionSecurityContextRepositoryTests.java b/web/src/test/java/org/springframework/security/web/context/HttpSessionSecurityContextRepositoryTests.java index f06e7bba25..6e9e3e91a3 100644 --- a/web/src/test/java/org/springframework/security/web/context/HttpSessionSecurityContextRepositoryTests.java +++ b/web/src/test/java/org/springframework/security/web/context/HttpSessionSecurityContextRepositoryTests.java @@ -203,6 +203,21 @@ public class HttpSessionSecurityContextRepositoryTests { assertNull(request.getSession().getAttribute("imTheContext")); } + // SEC-1735 + @Test + public void contextIsNotRemovedFromSessionIfContextBeforeExecutionDefault() throws Exception { + HttpSessionSecurityContextRepository repo = new HttpSessionSecurityContextRepository(); + MockHttpServletRequest request = new MockHttpServletRequest(); + HttpRequestResponseHolder holder = new HttpRequestResponseHolder(request, new MockHttpServletResponse()); + repo.loadContext(holder); + SecurityContext ctxInSession = SecurityContextHolder.createEmptyContext(); + ctxInSession.setAuthentication(testToken); + request.getSession().setAttribute(SPRING_SECURITY_CONTEXT_KEY, ctxInSession); + SecurityContextHolder.getContext().setAuthentication(new AnonymousAuthenticationToken("x","x", AuthorityUtils.createAuthorityList("ROLE_ANONYMOUS"))); + repo.saveContext(SecurityContextHolder.getContext(), holder.getRequest(), holder.getResponse()); + assertSame(ctxInSession,request.getSession().getAttribute(SPRING_SECURITY_CONTEXT_KEY)); + } + @Test @SuppressWarnings("deprecation") public void sessionDisableUrlRewritingPreventsSessionIdBeingWrittenToUrl() throws Exception {