Skip to content

Commit 95da121

Browse files
rwinchjzheaux
authored andcommitted
Additional Test for HttpSessionSecurityContextRepository
Issue gh-9387
1 parent 3116369 commit 95da121

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed

web/src/test/java/org/springframework/security/web/context/HttpSessionSecurityContextRepositoryTests.java

+58
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,16 @@
1616

1717
package org.springframework.security.web.context;
1818

19+
import java.io.IOException;
1920
import java.lang.annotation.ElementType;
2021
import java.lang.annotation.Retention;
2122
import java.lang.annotation.RetentionPolicy;
2223
import java.lang.annotation.Target;
2324

25+
import javax.servlet.Filter;
26+
import javax.servlet.ServletException;
2427
import javax.servlet.ServletOutputStream;
28+
import javax.servlet.http.HttpServlet;
2529
import javax.servlet.http.HttpServletRequest;
2630
import javax.servlet.http.HttpServletRequestWrapper;
2731
import javax.servlet.http.HttpServletResponse;
@@ -31,17 +35,22 @@
3135
import org.junit.After;
3236
import org.junit.Test;
3337

38+
import org.springframework.mock.web.MockFilterChain;
3439
import org.springframework.mock.web.MockHttpServletRequest;
3540
import org.springframework.mock.web.MockHttpServletResponse;
3641
import org.springframework.mock.web.MockHttpSession;
3742
import org.springframework.security.authentication.AbstractAuthenticationToken;
3843
import org.springframework.security.authentication.AnonymousAuthenticationToken;
3944
import org.springframework.security.authentication.AuthenticationTrustResolver;
4045
import org.springframework.security.authentication.TestingAuthenticationToken;
46+
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
4147
import org.springframework.security.core.Transient;
4248
import org.springframework.security.core.authority.AuthorityUtils;
4349
import org.springframework.security.core.context.SecurityContext;
4450
import org.springframework.security.core.context.SecurityContextHolder;
51+
import org.springframework.security.core.context.SecurityContextImpl;
52+
import org.springframework.security.core.userdetails.User;
53+
import org.springframework.security.core.userdetails.UserDetails;
4554

4655
import static org.assertj.core.api.Assertions.assertThat;
4756
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
@@ -162,6 +171,48 @@ public void saveContextCallsSetAttributeIfContextIsModifiedDirectlyDuringRequest
162171
verify(session).setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, ctx);
163172
}
164173

174+
@Test
175+
public void saveContextWhenSaveNewContextThenOriginalContextThenOriginalContextSaved() throws Exception {
176+
HttpSessionSecurityContextRepository repository = new HttpSessionSecurityContextRepository();
177+
SecurityContextPersistenceFilter securityContextPersistenceFilter = new SecurityContextPersistenceFilter(
178+
repository);
179+
180+
UserDetails original = User.withUsername("user").password("password").roles("USER").build();
181+
SecurityContext originalContext = createSecurityContext(original);
182+
UserDetails impersonate = User.withUserDetails(original).username("impersonate").build();
183+
SecurityContext impersonateContext = createSecurityContext(impersonate);
184+
185+
MockHttpServletRequest mockRequest = new MockHttpServletRequest();
186+
MockHttpServletResponse mockResponse = new MockHttpServletResponse();
187+
188+
Filter saveImpersonateContext = (request, response, chain) -> {
189+
SecurityContextHolder.setContext(impersonateContext);
190+
// ensure the response is committed to trigger save
191+
response.flushBuffer();
192+
chain.doFilter(request, response);
193+
};
194+
Filter saveOriginalContext = (request, response, chain) -> {
195+
SecurityContextHolder.setContext(originalContext);
196+
chain.doFilter(request, response);
197+
};
198+
HttpServlet servlet = new HttpServlet() {
199+
@Override
200+
protected void service(HttpServletRequest req, HttpServletResponse resp)
201+
throws ServletException, IOException {
202+
resp.getWriter().write("Hi");
203+
}
204+
};
205+
206+
SecurityContextHolder.setContext(originalContext);
207+
MockFilterChain chain = new MockFilterChain(servlet, saveImpersonateContext, saveOriginalContext);
208+
209+
securityContextPersistenceFilter.doFilter(mockRequest, mockResponse, chain);
210+
211+
assertThat(
212+
mockRequest.getSession().getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY))
213+
.isEqualTo(originalContext);
214+
}
215+
165216
@Test
166217
public void nonSecurityContextInSessionIsIgnored() {
167218
HttpSessionSecurityContextRepository repo = new HttpSessionSecurityContextRepository();
@@ -577,6 +628,13 @@ public void saveContextWhenTransientAuthenticationWithCustomAnnotationThenSkippe
577628
assertThat(session).isNull();
578629
}
579630

631+
private SecurityContext createSecurityContext(UserDetails userDetails) {
632+
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(userDetails,
633+
userDetails.getPassword(), userDetails.getAuthorities());
634+
SecurityContext securityContext = new SecurityContextImpl(token);
635+
return securityContext;
636+
}
637+
580638
@Transient
581639
private static class SomeTransientAuthentication extends AbstractAuthenticationToken {
582640

0 commit comments

Comments
 (0)