Skip to content

Commit 51a0cff

Browse files
committed
Post-process AuthenticationRequestFilter
Fixes gh-8552
1 parent 8e7c4c1 commit 51a0cff

File tree

2 files changed

+58
-2
lines changed

2 files changed

+58
-2
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/configurers/saml2/Saml2LoginConfigurer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,9 +323,9 @@ private AuthenticationRequestEndpointConfig() {
323323
private Filter build(B http) {
324324
Saml2AuthenticationRequestFactory authenticationRequestResolver = getResolver(http);
325325

326-
return new Saml2WebSsoAuthenticationRequestFilter(
326+
return postProcess(new Saml2WebSsoAuthenticationRequestFilter(
327327
Saml2LoginConfigurer.this.relyingPartyRegistrationRepository,
328-
authenticationRequestResolver);
328+
authenticationRequestResolver));
329329
}
330330

331331
private Saml2AuthenticationRequestFactory getResolver(B http) {

config/src/test/java/org/springframework/security/config/annotation/web/configurers/saml2/Saml2LoginConfigurerTests.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.Collection;
2424
import java.util.Collections;
2525
import javax.servlet.ServletException;
26+
import javax.servlet.http.HttpServletRequest;
2627

2728
import org.junit.After;
2829
import org.junit.Assert;
@@ -55,9 +56,13 @@
5556
import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper;
5657
import org.springframework.security.saml2.provider.service.authentication.OpenSamlAuthenticationProvider;
5758
import org.springframework.security.saml2.provider.service.authentication.Saml2Authentication;
59+
import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticationRequestContext;
5860
import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticationToken;
61+
import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration;
5962
import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository;
6063
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;
6166
import org.springframework.security.web.FilterChainProxy;
6267
import org.springframework.security.web.context.HttpRequestResponseHolder;
6368
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
@@ -66,10 +71,15 @@
6671
import org.springframework.test.web.servlet.MockMvc;
6772

6873
import static org.assertj.core.api.Assertions.assertThat;
74+
import static org.mockito.ArgumentMatchers.any;
6975
import static org.mockito.ArgumentMatchers.anyString;
7076
import static org.mockito.Mockito.mock;
77+
import static org.mockito.Mockito.verify;
7178
import static org.mockito.Mockito.when;
79+
import static org.springframework.security.saml2.provider.service.authentication.TestSaml2AuthenticationRequestContexts.authenticationRequestContext;
7280
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;
7383

7484
/**
7585
* Tests for different Java configuration for {@link Saml2LoginConfigurer}
@@ -133,6 +143,20 @@ public void saml2LoginWhenConfiguringAuthenticationDefaultsUsingCustomizerThenTh
133143
validateSaml2WebSsoAuthenticationFilterConfiguration();
134144
}
135145

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+
136160
private void validateSaml2WebSsoAuthenticationFilterConfiguration() {
137161
// get the OpenSamlAuthenticationProvider
138162
Saml2WebSsoAuthenticationFilter filter = getSaml2SsoFilter(this.springSecurityFilterChain);
@@ -219,6 +243,38 @@ public <O extends OpenSamlAuthenticationProvider> O postProcess(O provider) {
219243
}
220244
}
221245

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+
222278
private static AuthenticationManager getAuthenticationManagerMock(String role) {
223279
return new AuthenticationManager() {
224280

0 commit comments

Comments
 (0)