SEC-1587: Add explicit call to removeAttribute() to remove the context from the session if the current context is empty or anonymous.
Allows for the situation where a user is logged out without invalidating the session.
This commit is contained in:
		
							parent
							
								
									7754882ba9
								
							
						
					
					
						commit
						8b51c2c97d
					
				| 
						 | 
					@ -262,22 +262,28 @@ public class HttpSessionSecurityContextRepository implements SecurityContextRepo
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        @Override
 | 
					        @Override
 | 
				
			||||||
        protected void saveContext(SecurityContext context) {
 | 
					        protected void saveContext(SecurityContext context) {
 | 
				
			||||||
 | 
					            final Authentication authentication = context.getAuthentication();
 | 
				
			||||||
 | 
					            HttpSession httpSession = request.getSession(false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // See SEC-776
 | 
					            // See SEC-776
 | 
				
			||||||
            if (authenticationTrustResolver.isAnonymous(context.getAuthentication())) {
 | 
					            if (authentication == null || authenticationTrustResolver.isAnonymous(authentication)) {
 | 
				
			||||||
                if (logger.isDebugEnabled()) {
 | 
					                if (logger.isDebugEnabled()) {
 | 
				
			||||||
                    logger.debug("SecurityContext contents are anonymous - context will not be stored in HttpSession.");
 | 
					                    logger.debug("SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (httpSession != null) {
 | 
				
			||||||
 | 
					                    // SEC-1587 A non-anonymous context may still be in the session
 | 
				
			||||||
 | 
					                    httpSession.removeAttribute(SPRING_SECURITY_CONTEXT_KEY);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            HttpSession httpSession = request.getSession(false);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (httpSession == null) {
 | 
					            if (httpSession == null) {
 | 
				
			||||||
                httpSession = createNewSessionIfAllowed(context);
 | 
					                httpSession = createNewSessionIfAllowed(context);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // If HttpSession exists, store current SecurityContextHolder contents but only if
 | 
					            // If HttpSession exists, store current SecurityContext but only if it has
 | 
				
			||||||
            // the SecurityContext has actually changed in this thread (see SEC-37, SEC-1307, SEC-1528)
 | 
					            // actually changed in this thread (see SEC-37, SEC-1307, SEC-1528)
 | 
				
			||||||
            if (httpSession != null) {
 | 
					            if (httpSession != null) {
 | 
				
			||||||
                // We may have a new session, so check also whether the context attribute is set SEC-1561
 | 
					                // We may have a new session, so check also whether the context attribute is set SEC-1561
 | 
				
			||||||
                if (contextChanged(context) || httpSession.getAttribute(SPRING_SECURITY_CONTEXT_KEY) == null) {
 | 
					                if (contextChanged(context) || httpSession.getAttribute(SPRING_SECURITY_CONTEXT_KEY) == null) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -170,6 +170,35 @@ public class HttpSessionSecurityContextRepositoryTests {
 | 
				
			||||||
        assertNull(request.getSession(false));
 | 
					        assertNull(request.getSession(false));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // SEC-1587
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    public void contextIsRemovedFromSessionIfCurrentContextIsAnonymous() throws Exception {
 | 
				
			||||||
 | 
					        HttpSessionSecurityContextRepository repo = new HttpSessionSecurityContextRepository();
 | 
				
			||||||
 | 
					        MockHttpServletRequest request = new MockHttpServletRequest();
 | 
				
			||||||
 | 
					        SecurityContext ctxInSession = SecurityContextHolder.createEmptyContext();
 | 
				
			||||||
 | 
					        ctxInSession.setAuthentication(testToken);
 | 
				
			||||||
 | 
					        request.getSession().setAttribute(SPRING_SECURITY_CONTEXT_KEY, ctxInSession);
 | 
				
			||||||
 | 
					        HttpRequestResponseHolder holder = new HttpRequestResponseHolder(request, new MockHttpServletResponse());
 | 
				
			||||||
 | 
					        repo.loadContext(holder);
 | 
				
			||||||
 | 
					        SecurityContextHolder.getContext().setAuthentication(new AnonymousAuthenticationToken("x","x", testToken.getAuthorities()));
 | 
				
			||||||
 | 
					        repo.saveContext(SecurityContextHolder.getContext(), holder.getRequest(), holder.getResponse());
 | 
				
			||||||
 | 
					        assertNull(request.getSession().getAttribute(SPRING_SECURITY_CONTEXT_KEY));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    public void contextIsRemovedFromSessionIfCurrentContextIsEmpty() throws Exception {
 | 
				
			||||||
 | 
					        HttpSessionSecurityContextRepository repo = new HttpSessionSecurityContextRepository();
 | 
				
			||||||
 | 
					        MockHttpServletRequest request = new MockHttpServletRequest();
 | 
				
			||||||
 | 
					        SecurityContext ctxInSession = SecurityContextHolder.createEmptyContext();
 | 
				
			||||||
 | 
					        ctxInSession.setAuthentication(testToken);
 | 
				
			||||||
 | 
					        request.getSession().setAttribute(SPRING_SECURITY_CONTEXT_KEY, ctxInSession);
 | 
				
			||||||
 | 
					        HttpRequestResponseHolder holder = new HttpRequestResponseHolder(request, new MockHttpServletResponse());
 | 
				
			||||||
 | 
					        repo.loadContext(holder);
 | 
				
			||||||
 | 
					        // Save an empty context
 | 
				
			||||||
 | 
					        repo.saveContext(SecurityContextHolder.getContext(), holder.getRequest(), holder.getResponse());
 | 
				
			||||||
 | 
					        assertNull(request.getSession().getAttribute(SPRING_SECURITY_CONTEXT_KEY));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Test
 | 
					    @Test
 | 
				
			||||||
    @SuppressWarnings("deprecation")
 | 
					    @SuppressWarnings("deprecation")
 | 
				
			||||||
    public void sessionDisableUrlRewritingPreventsSessionIdBeingWrittenToUrl() throws Exception {
 | 
					    public void sessionDisableUrlRewritingPreventsSessionIdBeingWrittenToUrl() throws Exception {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue