Skip to content

Commit 7576dc4

Browse files
committed
AuthenticationFilter Session Fixation Protection
Fixes gh-7446
1 parent 496a2cd commit 7576dc4

File tree

2 files changed

+37
-9
lines changed

2 files changed

+37
-9
lines changed

web/src/main/java/org/springframework/security/web/authentication/AuthenticationFilter.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@
1616
package org.springframework.security.web.authentication;
1717

1818
import java.io.IOException;
19-
2019
import javax.servlet.Filter;
2120
import javax.servlet.FilterChain;
2221
import javax.servlet.ServletException;
2322
import javax.servlet.http.HttpServletRequest;
2423
import javax.servlet.http.HttpServletResponse;
24+
import javax.servlet.http.HttpSession;
2525

2626
import org.springframework.http.HttpStatus;
2727
import org.springframework.security.authentication.AuthenticationManager;
@@ -146,6 +146,11 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
146146
return;
147147
}
148148

149+
HttpSession session = request.getSession(false);
150+
if (session != null) {
151+
request.changeSessionId();
152+
}
153+
149154
successfulAuthentication(request, response, filterChain, authenticationResult);
150155
} catch (AuthenticationException e) {
151156
unsuccessfulAuthentication(request, response, e);

web/src/test/java/org/springframework/security/web/authentication/AuthenticationFilterTests.java

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,6 @@
1515
*/
1616
package org.springframework.security.web.authentication;
1717

18-
import static org.assertj.core.api.Assertions.assertThat;
19-
import static org.mockito.ArgumentMatchers.any;
20-
import static org.mockito.ArgumentMatchers.eq;
21-
import static org.mockito.Mockito.mock;
22-
import static org.mockito.Mockito.verify;
23-
import static org.mockito.Mockito.verifyZeroInteractions;
24-
import static org.mockito.Mockito.when;
25-
2618
import javax.servlet.FilterChain;
2719
import javax.servlet.ServletException;
2820
import javax.servlet.ServletRequest;
@@ -35,9 +27,12 @@
3527
import org.junit.runner.RunWith;
3628
import org.mockito.Mock;
3729
import org.mockito.junit.MockitoJUnitRunner;
30+
3831
import org.springframework.http.HttpStatus;
32+
import org.springframework.mock.web.MockFilterChain;
3933
import org.springframework.mock.web.MockHttpServletRequest;
4034
import org.springframework.mock.web.MockHttpServletResponse;
35+
import org.springframework.mock.web.MockHttpSession;
4136
import org.springframework.security.authentication.AuthenticationManager;
4237
import org.springframework.security.authentication.AuthenticationManagerResolver;
4338
import org.springframework.security.authentication.BadCredentialsException;
@@ -46,6 +41,14 @@
4641
import org.springframework.security.core.context.SecurityContextHolder;
4742
import org.springframework.security.web.util.matcher.RequestMatcher;
4843

44+
import static org.assertj.core.api.Assertions.assertThat;
45+
import static org.mockito.ArgumentMatchers.any;
46+
import static org.mockito.ArgumentMatchers.eq;
47+
import static org.mockito.Mockito.mock;
48+
import static org.mockito.Mockito.verify;
49+
import static org.mockito.Mockito.verifyZeroInteractions;
50+
import static org.mockito.Mockito.when;
51+
4952
/**
5053
* @author Sergey Bespalov
5154
* @since 5.2.0
@@ -246,4 +249,24 @@ public void filterWhenNotMatchAndConvertAndAuthenticationSuccessThenContinues()
246249
assertThat(SecurityContextHolder.getContext().getAuthentication()).isNull();
247250
}
248251

252+
// gh-7446
253+
@Test
254+
public void filterWhenSuccessfulAuthenticationThenSessionIdChanges() throws Exception {
255+
Authentication authentication = new TestingAuthenticationToken("test", "this", "ROLE_USER");
256+
when(this.authenticationConverter.convert(any())).thenReturn(authentication);
257+
when(this.authenticationManager.authenticate(any())).thenReturn(authentication);
258+
259+
MockHttpSession session = new MockHttpSession();
260+
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/");
261+
request.setSession(session);
262+
MockHttpServletResponse response = new MockHttpServletResponse();
263+
FilterChain chain = new MockFilterChain();
264+
265+
String sessionId = session.getId();
266+
AuthenticationFilter filter = new AuthenticationFilter(this.authenticationManager, this.authenticationConverter);
267+
filter.doFilter(request, response, chain);
268+
269+
assertThat(session.getId()).isNotEqualTo(sessionId);
270+
}
271+
249272
}

0 commit comments

Comments
 (0)