|
23 | 23 | import java.util.Collection;
|
24 | 24 | import java.util.Collections;
|
25 | 25 | import javax.servlet.ServletException;
|
| 26 | +import javax.servlet.http.HttpServletRequest; |
26 | 27 |
|
27 | 28 | import org.junit.After;
|
28 | 29 | import org.junit.Assert;
|
|
55 | 56 | import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;
|
56 | 57 | import org.springframework.security.saml2.provider.service.authentication.OpenSamlAuthenticationProvider;
|
57 | 58 | import org.springframework.security.saml2.provider.service.authentication.Saml2Authentication;
|
| 59 | +import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticationRequestContext; |
58 | 60 | import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticationToken;
|
| 61 | +import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration; |
59 | 62 | import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository;
|
60 | 63 | import org.springframework.security.saml2.provider.service.servlet.filter.Saml2WebSsoAuthenticationFilter;
|
| 64 | +import org.springframework.security.saml2.provider.service.servlet.filter.Saml2WebSsoAuthenticationRequestFilter; |
| 65 | +import org.springframework.security.saml2.provider.service.web.Saml2AuthenticationRequestContextResolver; |
61 | 66 | import org.springframework.security.web.FilterChainProxy;
|
62 | 67 | import org.springframework.security.web.context.HttpRequestResponseHolder;
|
63 | 68 | import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
|
|
66 | 71 | import org.springframework.test.web.servlet.MockMvc;
|
67 | 72 |
|
68 | 73 | import static org.assertj.core.api.Assertions.assertThat;
|
| 74 | +import static org.mockito.ArgumentMatchers.any; |
69 | 75 | import static org.mockito.ArgumentMatchers.anyString;
|
70 | 76 | import static org.mockito.Mockito.mock;
|
| 77 | +import static org.mockito.Mockito.verify; |
71 | 78 | import static org.mockito.Mockito.when;
|
| 79 | +import static org.springframework.security.saml2.provider.service.authentication.TestSaml2AuthenticationRequestContexts.authenticationRequestContext; |
72 | 80 | import static org.springframework.security.saml2.provider.service.registration.TestRelyingPartyRegistrations.relyingPartyRegistration;
|
| 81 | +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; |
| 82 | +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |
73 | 83 |
|
74 | 84 | /**
|
75 | 85 | * Tests for different Java configuration for {@link Saml2LoginConfigurer}
|
@@ -133,6 +143,20 @@ public void saml2LoginWhenConfiguringAuthenticationDefaultsUsingCustomizerThenTh
|
133 | 143 | validateSaml2WebSsoAuthenticationFilterConfiguration();
|
134 | 144 | }
|
135 | 145 |
|
| 146 | + @Test |
| 147 | + public void saml2LoginWhenCustomAuthenticationRequestContextResolverThenUses() throws Exception { |
| 148 | + this.spring.register(CustomAuthenticationRequestContextResolver.class).autowire(); |
| 149 | + |
| 150 | + Saml2AuthenticationRequestContext context = authenticationRequestContext().build(); |
| 151 | + Saml2AuthenticationRequestContextResolver resolver = |
| 152 | + CustomAuthenticationRequestContextResolver.resolver; |
| 153 | + when(resolver.resolve(any(HttpServletRequest.class), any(RelyingPartyRegistration.class))) |
| 154 | + .thenReturn(context); |
| 155 | + this.mvc.perform(get("/saml2/authenticate/registration-id")) |
| 156 | + .andExpect(status().isFound()); |
| 157 | + verify(resolver).resolve(any(HttpServletRequest.class), any(RelyingPartyRegistration.class)); |
| 158 | + } |
| 159 | + |
136 | 160 | private void validateSaml2WebSsoAuthenticationFilterConfiguration() {
|
137 | 161 | // get the OpenSamlAuthenticationProvider
|
138 | 162 | Saml2WebSsoAuthenticationFilter filter = getSaml2SsoFilter(this.springSecurityFilterChain);
|
@@ -219,6 +243,38 @@ public <O extends OpenSamlAuthenticationProvider> O postProcess(O provider) {
|
219 | 243 | }
|
220 | 244 | }
|
221 | 245 |
|
| 246 | + @EnableWebSecurity |
| 247 | + @Import(Saml2LoginConfigBeans.class) |
| 248 | + static class CustomAuthenticationRequestContextResolver extends WebSecurityConfigurerAdapter { |
| 249 | + private static final Saml2AuthenticationRequestContextResolver resolver = |
| 250 | + mock(Saml2AuthenticationRequestContextResolver.class); |
| 251 | + |
| 252 | + @Override |
| 253 | + protected void configure(HttpSecurity http) throws Exception { |
| 254 | + ObjectPostProcessor<Saml2WebSsoAuthenticationRequestFilter> processor |
| 255 | + = new ObjectPostProcessor<Saml2WebSsoAuthenticationRequestFilter>() { |
| 256 | + @Override |
| 257 | + public <O extends Saml2WebSsoAuthenticationRequestFilter> O postProcess(O filter) { |
| 258 | + filter.setAuthenticationRequestContextResolver(resolver); |
| 259 | + return filter; |
| 260 | + } |
| 261 | + }; |
| 262 | + |
| 263 | + http |
| 264 | + .authorizeRequests(authz -> authz |
| 265 | + .anyRequest().authenticated() |
| 266 | + ) |
| 267 | + .saml2Login(saml2 -> saml2 |
| 268 | + .addObjectPostProcessor(processor) |
| 269 | + ); |
| 270 | + } |
| 271 | + |
| 272 | + @Bean |
| 273 | + Saml2AuthenticationRequestContextResolver resolver() { |
| 274 | + return resolver; |
| 275 | + } |
| 276 | + } |
| 277 | + |
222 | 278 | private static AuthenticationManager getAuthenticationManagerMock(String role) {
|
223 | 279 | return new AuthenticationManager() {
|
224 | 280 |
|
|
0 commit comments