|
16 | 16 |
|
17 | 17 | package org.springframework.security.web.authentication.switchuser;
|
18 | 18 |
|
| 19 | +import java.io.IOException; |
19 | 20 | import java.util.ArrayList;
|
20 | 21 | import java.util.List;
|
21 | 22 |
|
22 | 23 | import javax.servlet.FilterChain;
|
| 24 | +import javax.servlet.ServletException; |
23 | 25 |
|
24 | 26 | import org.junit.jupiter.api.AfterEach;
|
25 | 27 | import org.junit.jupiter.api.BeforeEach;
|
26 | 28 | import org.junit.jupiter.api.Test;
|
27 | 29 |
|
| 30 | +import org.springframework.mock.web.MockFilterChain; |
28 | 31 | import org.springframework.mock.web.MockHttpServletRequest;
|
29 | 32 | import org.springframework.mock.web.MockHttpServletResponse;
|
30 | 33 | import org.springframework.security.authentication.AccountExpiredException;
|
|
44 | 47 | import org.springframework.security.util.FieldUtils;
|
45 | 48 | import org.springframework.security.web.DefaultRedirectStrategy;
|
46 | 49 | import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
|
| 50 | +import org.springframework.security.web.context.RequestAttributeSecurityContextRepository; |
| 51 | +import org.springframework.security.web.context.SecurityContextRepository; |
47 | 52 | import org.springframework.security.web.util.matcher.AnyRequestMatcher;
|
| 53 | +import org.springframework.test.util.ReflectionTestUtils; |
48 | 54 |
|
49 | 55 | import static org.assertj.core.api.Assertions.assertThat;
|
50 | 56 | import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
51 | 57 | import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
| 58 | +import static org.mockito.ArgumentMatchers.any; |
52 | 59 | import static org.mockito.Mockito.mock;
|
53 | 60 | import static org.mockito.Mockito.never;
|
54 | 61 | import static org.mockito.Mockito.verify;
|
@@ -483,6 +490,59 @@ public void setSwitchFailureUrlWhenValidThenNoException() {
|
483 | 490 | filter.setSwitchFailureUrl("/foo");
|
484 | 491 | }
|
485 | 492 |
|
| 493 | + @Test |
| 494 | + void filterWhenDefaultSecurityContextRepositoryThenRequestAttributeRepository() { |
| 495 | + SwitchUserFilter switchUserFilter = new SwitchUserFilter(); |
| 496 | + assertThat(ReflectionTestUtils.getField(switchUserFilter, "securityContextRepository")) |
| 497 | + .isInstanceOf(RequestAttributeSecurityContextRepository.class); |
| 498 | + } |
| 499 | + |
| 500 | + @Test |
| 501 | + void doFilterWhenSwitchUserThenSaveSecurityContext() throws ServletException, IOException { |
| 502 | + SecurityContextRepository securityContextRepository = mock(SecurityContextRepository.class); |
| 503 | + MockHttpServletRequest request = new MockHttpServletRequest(); |
| 504 | + MockHttpServletResponse response = new MockHttpServletResponse(); |
| 505 | + MockFilterChain filterChain = new MockFilterChain(); |
| 506 | + request.setParameter(SwitchUserFilter.SPRING_SECURITY_SWITCH_USERNAME_KEY, "jacklord"); |
| 507 | + request.setRequestURI("/login/impersonate"); |
| 508 | + SwitchUserFilter filter = new SwitchUserFilter(); |
| 509 | + filter.setSecurityContextRepository(securityContextRepository); |
| 510 | + filter.setUserDetailsService(new MockUserDetailsService()); |
| 511 | + filter.setTargetUrl("/target"); |
| 512 | + filter.afterPropertiesSet(); |
| 513 | + |
| 514 | + filter.doFilter(request, response, filterChain); |
| 515 | + |
| 516 | + verify(securityContextRepository).saveContext(any(), any(), any()); |
| 517 | + } |
| 518 | + |
| 519 | + @Test |
| 520 | + void doFilterWhenExitUserThenSaveSecurityContext() throws ServletException, IOException { |
| 521 | + UsernamePasswordAuthenticationToken source = UsernamePasswordAuthenticationToken.authenticated("dano", |
| 522 | + "hawaii50", ROLES_12); |
| 523 | + // set current user (Admin) |
| 524 | + List<GrantedAuthority> adminAuths = new ArrayList<>(ROLES_12); |
| 525 | + adminAuths.add(new SwitchUserGrantedAuthority("PREVIOUS_ADMINISTRATOR", source)); |
| 526 | + UsernamePasswordAuthenticationToken admin = UsernamePasswordAuthenticationToken.authenticated("jacklord", |
| 527 | + "hawaii50", adminAuths); |
| 528 | + SecurityContextHolder.getContext().setAuthentication(admin); |
| 529 | + SecurityContextRepository securityContextRepository = mock(SecurityContextRepository.class); |
| 530 | + MockHttpServletRequest request = new MockHttpServletRequest(); |
| 531 | + MockHttpServletResponse response = new MockHttpServletResponse(); |
| 532 | + MockFilterChain filterChain = new MockFilterChain(); |
| 533 | + request.setParameter(SwitchUserFilter.SPRING_SECURITY_SWITCH_USERNAME_KEY, "jacklord"); |
| 534 | + request.setRequestURI("/logout/impersonate"); |
| 535 | + SwitchUserFilter filter = new SwitchUserFilter(); |
| 536 | + filter.setSecurityContextRepository(securityContextRepository); |
| 537 | + filter.setUserDetailsService(new MockUserDetailsService()); |
| 538 | + filter.setTargetUrl("/target"); |
| 539 | + filter.afterPropertiesSet(); |
| 540 | + |
| 541 | + filter.doFilter(request, response, filterChain); |
| 542 | + |
| 543 | + verify(securityContextRepository).saveContext(any(), any(), any()); |
| 544 | + } |
| 545 | + |
486 | 546 | private class MockUserDetailsService implements UserDetailsService {
|
487 | 547 |
|
488 | 548 | private String password = "hawaii50";
|
|
0 commit comments