Skip to content

Commit b502697

Browse files
blake-baumanrwinch
authored andcommitted
feat: Add option to specify a custom ServerAuthenticationConverter for x509()
Signed-off-by: blake_bauman <[email protected]>
1 parent a0fe04c commit b502697

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

config/src/main/java/org/springframework/security/config/web/server/ServerHttpSecurity.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3231,6 +3231,8 @@ public final class X509Spec {
32313231

32323232
private ReactiveAuthenticationManager authenticationManager;
32333233

3234+
private ServerAuthenticationConverter serverAuthenticationConverter;
3235+
32343236
private X509Spec() {
32353237
}
32363238

@@ -3244,11 +3246,17 @@ public X509Spec authenticationManager(ReactiveAuthenticationManager authenticati
32443246
return this;
32453247
}
32463248

3249+
public X509Spec serverAuthenticationConverter(ServerAuthenticationConverter serverAuthenticationConverter) {
3250+
this.serverAuthenticationConverter = serverAuthenticationConverter;
3251+
return this;
3252+
}
3253+
32473254
protected void configure(ServerHttpSecurity http) {
32483255
ReactiveAuthenticationManager authenticationManager = getAuthenticationManager();
32493256
X509PrincipalExtractor principalExtractor = getPrincipalExtractor();
3257+
ServerAuthenticationConverter converter = getServerAuthenticationConverter(principalExtractor);
32503258
AuthenticationWebFilter filter = new AuthenticationWebFilter(authenticationManager);
3251-
filter.setServerAuthenticationConverter(new ServerX509AuthenticationConverter(principalExtractor));
3259+
filter.setServerAuthenticationConverter(serverAuthenticationConverter);
32523260
http.addFilterAt(filter, SecurityWebFiltersOrder.AUTHENTICATION);
32533261
}
32543262

@@ -3267,6 +3275,13 @@ private ReactiveAuthenticationManager getAuthenticationManager() {
32673275
return new ReactivePreAuthenticatedAuthenticationManager(userDetailsService);
32683276
}
32693277

3278+
private ServerAuthenticationConverter getServerAuthenticationConverter(X509PrincipalExtractor extractor) {
3279+
if (this.serverAuthenticationConverter != null) {
3280+
return this.serverAuthenticationConverter;
3281+
}
3282+
return new ServerX509AuthenticationConverter(extractor);
3283+
}
3284+
32703285
}
32713286

32723287
public final class OAuth2LoginSpec {

config/src/test/java/org/springframework/security/config/web/server/ServerHttpSecurityTests.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import org.springframework.security.web.server.authentication.DelegatingServerAuthenticationSuccessHandler;
6161
import org.springframework.security.web.server.authentication.HttpBasicServerAuthenticationEntryPoint;
6262
import org.springframework.security.web.server.authentication.HttpStatusServerEntryPoint;
63+
import org.springframework.security.web.server.authentication.ServerAuthenticationConverter;
6364
import org.springframework.security.web.server.authentication.ServerAuthenticationFailureHandler;
6465
import org.springframework.security.web.server.authentication.ServerAuthenticationSuccessHandler;
6566
import org.springframework.security.web.server.authentication.ServerX509AuthenticationConverter;
@@ -497,6 +498,17 @@ public void x509WhenCustomizedThenAddsX509Filter() {
497498
assertThat(x509WebFilter).isNotNull();
498499
}
499500

501+
@Test
502+
public void x509WithConverterAndNoExtractorThenAddsX509Filter() {
503+
ServerAuthenticationConverter mockConverter = mock(ServerAuthenticationConverter.class);
504+
this.http.x509((x509) -> x509.serverAuthenticationConverter(mockConverter));
505+
SecurityWebFilterChain securityWebFilterChain = this.http.build();
506+
WebFilter x509WebFilter = securityWebFilterChain.getWebFilters()
507+
.filter(filter -> matchesX509Converter(filter, mockConverter))
508+
.blockFirst();
509+
assertThat(x509WebFilter).isNotNull();
510+
}
511+
500512
@Test
501513
public void addsX509FilterWhenX509AuthenticationIsConfiguredWithDefaults() {
502514
this.http.x509(withDefaults());
@@ -769,6 +781,17 @@ private boolean isX509Filter(WebFilter filter) {
769781
}
770782
}
771783

784+
private boolean matchesX509Converter(WebFilter filter, ServerAuthenticationConverter expectedConverter) {
785+
try {
786+
Object converter = ReflectionTestUtils.getField(filter, "authenticationConverter");
787+
return converter.equals(expectedConverter);
788+
}
789+
catch (IllegalArgumentException ex) {
790+
// field doesn't exist
791+
return false;
792+
}
793+
}
794+
772795
private <T extends WebFilter> Optional<T> getWebFilter(SecurityWebFilterChain filterChain, Class<T> filterClass) {
773796
return (Optional<T>) filterChain.getWebFilters()
774797
.filter(Objects::nonNull)

0 commit comments

Comments
 (0)