瀏覽代碼

SEC-2791: AbstractRememberMeServices sets the version

If the maxAge < 1 then the version must be 1 otherwise browsers ignore
the value.
Rob Winch 10 年之前
父節點
當前提交
74f8534b17

+ 4 - 0
web/src/main/java/org/springframework/security/web/authentication/rememberme/AbstractRememberMeServices.java

@@ -349,6 +349,10 @@ public abstract class AbstractRememberMeServices implements RememberMeServices,
         cookie.setMaxAge(maxAge);
         cookie.setPath(getCookiePath(request));
 
+        if(maxAge < 1) {
+            cookie.setVersion(1);
+        }
+
         if (useSecureCookie == null) {
             cookie.setSecure(request.isSecure());
         } else {

+ 40 - 0
web/src/test/java/org/springframework/security/web/authentication/rememberme/AbstractRememberMeServicesTests.java

@@ -1,5 +1,6 @@
 package org.springframework.security.web.authentication.rememberme;
 
+import static org.fest.assertions.Assertions.*;
 import static org.powermock.api.mockito.PowerMockito.*;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -352,6 +353,45 @@ public class AbstractRememberMeServicesTests {
         assertNull(ReflectionTestUtils.getField(services, "setHttpOnlyMethod"));
     }
 
+    // SEC-2791
+    @Test
+    public void setCookieMaxAge0VersionSet() {
+        MockRememberMeServices services = new MockRememberMeServices();
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        MockHttpServletResponse response = new MockHttpServletResponse();
+
+        services.setCookie(new String[] {"value"}, 0, request, response);
+
+        Cookie cookie = response.getCookie(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY);
+        assertThat(cookie.getVersion()).isEqualTo(1);
+    }
+
+    // SEC-2791
+    @Test
+    public void setCookieMaxAgeNegativeVersionSet() {
+        MockRememberMeServices services = new MockRememberMeServices();
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        MockHttpServletResponse response = new MockHttpServletResponse();
+
+        services.setCookie(new String[] {"value"}, -1, request, response);
+
+        Cookie cookie = response.getCookie(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY);
+        assertThat(cookie.getVersion()).isEqualTo(1);
+    }
+
+    // SEC-2791
+    @Test
+    public void setCookieMaxAge1VersionSet() {
+        MockRememberMeServices services = new MockRememberMeServices();
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        MockHttpServletResponse response = new MockHttpServletResponse();
+
+        services.setCookie(new String[] {"value"}, 1, request, response);
+
+        Cookie cookie = response.getCookie(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY);
+        assertThat(cookie.getVersion()).isEqualTo(0);
+    }
+
     private Cookie[] createLoginCookie(String cookieToken) {
         MockRememberMeServices services = new MockRememberMeServices();
         Cookie cookie = new Cookie(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY,