Skip to content

Commit 355ef21

Browse files
author
Steve Riesenberg
committed
Polish gh-11665
1 parent 1efb633 commit 355ef21

File tree

14 files changed

+258
-88
lines changed

14 files changed

+258
-88
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/configurers/oauth2/server/resource/OAuth2ResourceServerConfigurer.java

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,10 @@
2121
import java.util.HashMap;
2222
import java.util.LinkedHashMap;
2323
import java.util.Map;
24-
import java.util.Optional;
2524
import java.util.function.Supplier;
2625

2726
import javax.servlet.http.HttpServletRequest;
2827

29-
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
3028
import org.springframework.context.ApplicationContext;
3129
import org.springframework.core.convert.converter.Converter;
3230
import org.springframework.http.MediaType;
@@ -460,7 +458,7 @@ public class OpaqueTokenConfigurer {
460458

461459
private Supplier<OpaqueTokenIntrospector> introspector;
462460

463-
private Supplier<OpaqueTokenAuthenticationConverter> authenticationConverter;
461+
private OpaqueTokenAuthenticationConverter authenticationConverter;
464462

465463
OpaqueTokenConfigurer(ApplicationContext context) {
466464
this.context = context;
@@ -499,7 +497,7 @@ public OpaqueTokenConfigurer introspector(OpaqueTokenIntrospector introspector)
499497
public OpaqueTokenConfigurer authenticationConverter(
500498
OpaqueTokenAuthenticationConverter authenticationConverter) {
501499
Assert.notNull(authenticationConverter, "authenticationConverter cannot be null");
502-
this.authenticationConverter = () -> authenticationConverter;
500+
this.authenticationConverter = authenticationConverter;
503501
return this;
504502
}
505503

@@ -510,26 +508,27 @@ OpaqueTokenIntrospector getIntrospector() {
510508
return this.context.getBean(OpaqueTokenIntrospector.class);
511509
}
512510

513-
Optional<OpaqueTokenAuthenticationConverter> getAuthenticationConverter() {
511+
OpaqueTokenAuthenticationConverter getAuthenticationConverter() {
514512
if (this.authenticationConverter != null) {
515-
return Optional.of(this.authenticationConverter.get());
513+
return this.authenticationConverter;
516514
}
517-
try {
518-
return Optional.of(this.context.getBean(OpaqueTokenAuthenticationConverter.class));
519-
}
520-
catch (NoSuchBeanDefinitionException nsbde) {
521-
return Optional.empty();
515+
if (this.context.getBeanNamesForType(OpaqueTokenAuthenticationConverter.class).length > 0) {
516+
return this.context.getBean(OpaqueTokenAuthenticationConverter.class);
522517
}
518+
return null;
523519
}
524520

525521
AuthenticationProvider getAuthenticationProvider() {
526522
if (this.authenticationManager != null) {
527523
return null;
528524
}
529525
OpaqueTokenIntrospector introspector = getIntrospector();
530-
final OpaqueTokenAuthenticationProvider opaqueTokenAuthenticationProvider = new OpaqueTokenAuthenticationProvider(
526+
OpaqueTokenAuthenticationProvider opaqueTokenAuthenticationProvider = new OpaqueTokenAuthenticationProvider(
531527
introspector);
532-
getAuthenticationConverter().ifPresent(opaqueTokenAuthenticationProvider::setAuthenticationConverter);
528+
OpaqueTokenAuthenticationConverter authenticationConverter = getAuthenticationConverter();
529+
if (authenticationConverter != null) {
530+
opaqueTokenAuthenticationProvider.setAuthenticationConverter(authenticationConverter);
531+
}
533532
return opaqueTokenAuthenticationProvider;
534533
}
535534

config/src/main/java/org/springframework/security/config/http/OAuth2ResourceServerBeanDefinitionParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ static final class OpaqueTokenBeanDefinitionParser implements BeanDefinitionPars
252252
static final String CLIENT_SECRET = "client-secret";
253253

254254
static final String AUTHENTICATION_CONVERTER_REF = "authentication-converter-ref";
255+
255256
static final String AUTHENTICATION_CONVERTER = "authenticationConverter";
256257

257258
OpaqueTokenBeanDefinitionParser() {
@@ -266,8 +267,7 @@ public BeanDefinition parse(Element element, ParserContext pc) {
266267
.rootBeanDefinition(OpaqueTokenAuthenticationProvider.class);
267268
opaqueTokenProviderBuilder.addConstructorArgValue(introspector);
268269
if (StringUtils.hasText(authenticationConverterRef)) {
269-
opaqueTokenProviderBuilder.addPropertyValue(AUTHENTICATION_CONVERTER,
270-
new RuntimeBeanReference(authenticationConverterRef));
270+
opaqueTokenProviderBuilder.addPropertyReference(AUTHENTICATION_CONVERTER, authenticationConverterRef);
271271
}
272272
return opaqueTokenProviderBuilder.getBeanDefinition();
273273
}

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

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2021 the original author or authors.
2+
* Copyright 2002-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -27,7 +27,6 @@
2727
import java.util.HashMap;
2828
import java.util.List;
2929
import java.util.Map;
30-
import java.util.Optional;
3130
import java.util.UUID;
3231
import java.util.function.Function;
3332
import java.util.function.Supplier;
@@ -36,7 +35,6 @@
3635
import reactor.util.context.Context;
3736

3837
import org.springframework.beans.BeansException;
39-
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
4038
import org.springframework.context.ApplicationContext;
4139
import org.springframework.core.Ordered;
4240
import org.springframework.core.ResolvableType;
@@ -4286,7 +4284,7 @@ public final class OpaqueTokenSpec {
42864284

42874285
private Supplier<ReactiveOpaqueTokenIntrospector> introspector;
42884286

4289-
private Supplier<ReactiveOpaqueTokenAuthenticationConverter> authenticationConverter;
4287+
private ReactiveOpaqueTokenAuthenticationConverter authenticationConverter;
42904288

42914289
private OpaqueTokenSpec() {
42924290
}
@@ -4329,7 +4327,7 @@ public OpaqueTokenSpec introspector(ReactiveOpaqueTokenIntrospector introspector
43294327
public OpaqueTokenSpec authenticationConverter(
43304328
ReactiveOpaqueTokenAuthenticationConverter authenticationConverter) {
43314329
Assert.notNull(authenticationConverter, "authenticationConverter cannot be null");
4332-
this.authenticationConverter = () -> authenticationConverter;
4330+
this.authenticationConverter = authenticationConverter;
43334331
return this;
43344332
}
43354333

@@ -4343,10 +4341,12 @@ public OAuth2ResourceServerSpec and() {
43434341
}
43444342

43454343
protected ReactiveAuthenticationManager getAuthenticationManager() {
4346-
final OpaqueTokenReactiveAuthenticationManager authenticationManager = new OpaqueTokenReactiveAuthenticationManager(
4344+
OpaqueTokenReactiveAuthenticationManager authenticationManager = new OpaqueTokenReactiveAuthenticationManager(
43474345
getIntrospector());
4348-
Optional.ofNullable(getAuthenticationConverter())
4349-
.ifPresent(authenticationManager::setAuthenticationConverter);
4346+
ReactiveOpaqueTokenAuthenticationConverter authenticationConverter = getAuthenticationConverter();
4347+
if (authenticationConverter != null) {
4348+
authenticationManager.setAuthenticationConverter(authenticationConverter);
4349+
}
43504350
return authenticationManager;
43514351
}
43524352

@@ -4359,14 +4359,9 @@ protected ReactiveOpaqueTokenIntrospector getIntrospector() {
43594359

43604360
protected ReactiveOpaqueTokenAuthenticationConverter getAuthenticationConverter() {
43614361
if (this.authenticationConverter != null) {
4362-
return this.authenticationConverter.get();
4363-
}
4364-
try {
4365-
return getBean(ReactiveOpaqueTokenAuthenticationConverter.class);
4366-
}
4367-
catch (NoSuchBeanDefinitionException nsbde) {
4368-
return null;
4362+
return this.authenticationConverter;
43694363
}
4364+
return getBeanOrNull(ReactiveOpaqueTokenAuthenticationConverter.class);
43704365
}
43714366

43724367
protected void configure(ServerHttpSecurity http) {

config/src/main/kotlin/org/springframework/security/config/web/server/ServerOpaqueTokenDsl.kt

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2020 the original author or authors.
2+
* Copyright 2002-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -31,29 +31,22 @@ import org.springframework.security.oauth2.server.resource.introspection.Reactiv
3131
class ServerOpaqueTokenDsl {
3232
private var _introspectionUri: String? = null
3333
private var _introspector: ReactiveOpaqueTokenIntrospector? = null
34-
private var _authenticationConverter: ReactiveOpaqueTokenAuthenticationConverter? = null
3534
private var clientCredentials: Pair<String, String>? = null
3635

3736
var introspectionUri: String?
3837
get() = _introspectionUri
3938
set(value) {
4039
_introspectionUri = value
4140
_introspector = null
42-
_authenticationConverter = null
4341
}
4442
var introspector: ReactiveOpaqueTokenIntrospector?
4543
get() = _introspector
4644
set(value) {
4745
_introspector = value
48-
_authenticationConverter = null
4946
_introspectionUri = null
5047
clientCredentials = null
5148
}
52-
var authenticationConverter: ReactiveOpaqueTokenAuthenticationConverter?
53-
get() = _authenticationConverter
54-
set(value) {
55-
_authenticationConverter = value
56-
}
49+
var authenticationConverter: ReactiveOpaqueTokenAuthenticationConverter? = null
5750

5851
/**
5952
* Configures the credentials for Introspection endpoint.
@@ -64,7 +57,6 @@ class ServerOpaqueTokenDsl {
6457
fun introspectionClientCredentials(clientId: String, clientSecret: String) {
6558
clientCredentials = Pair(clientId, clientSecret)
6659
_introspector = null
67-
_authenticationConverter = null
6860
}
6961

7062
internal fun get(): (ServerHttpSecurity.OAuth2ResourceServerSpec.OpaqueTokenSpec) -> Unit {

config/src/main/kotlin/org/springframework/security/config/web/servlet/oauth2/resourceserver/OpaqueTokenDsl.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2021 the original author or authors.
2+
* Copyright 2002-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -38,7 +38,6 @@ class OpaqueTokenDsl {
3838
private var _introspectionUri: String? = null
3939
private var _introspector: OpaqueTokenIntrospector? = null
4040
private var clientCredentials: Pair<String, String>? = null
41-
private var _authenticationConverter: OpaqueTokenAuthenticationConverter? = null
4241

4342
var authenticationManager: AuthenticationManager? = null
4443

@@ -56,11 +55,7 @@ class OpaqueTokenDsl {
5655
clientCredentials = null
5756
}
5857

59-
var authenticationConverter: OpaqueTokenAuthenticationConverter?
60-
get() = _authenticationConverter
61-
set(value) {
62-
_authenticationConverter = value
63-
}
58+
var authenticationConverter: OpaqueTokenAuthenticationConverter? = null
6459

6560
/**
6661
* Configures the credentials for Introspection endpoint.

config/src/test/java/org/springframework/security/config/annotation/web/configurers/oauth2/server/resource/OAuth2ResourceServerConfigurerTests.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
import org.springframework.security.authentication.AuthenticationManagerResolver;
8383
import org.springframework.security.authentication.AuthenticationProvider;
8484
import org.springframework.security.authentication.AuthenticationServiceException;
85+
import org.springframework.security.authentication.TestingAuthenticationToken;
8586
import org.springframework.security.config.annotation.ObjectPostProcessor;
8687
import org.springframework.security.config.annotation.SecurityContextChangedListenerConfig;
8788
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
@@ -103,6 +104,7 @@
103104
import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository;
104105
import org.springframework.security.oauth2.client.registration.TestClientRegistrations;
105106
import org.springframework.security.oauth2.core.DefaultOAuth2AuthenticatedPrincipal;
107+
import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal;
106108
import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
107109
import org.springframework.security.oauth2.core.OAuth2Error;
108110
import org.springframework.security.oauth2.core.OAuth2TokenValidator;
@@ -121,6 +123,7 @@
121123
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
122124
import org.springframework.security.oauth2.server.resource.authentication.JwtIssuerAuthenticationManagerResolver;
123125
import org.springframework.security.oauth2.server.resource.introspection.NimbusOpaqueTokenIntrospector;
126+
import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenAuthenticationConverter;
124127
import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector;
125128
import org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationEntryPoint;
126129
import org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationFilter;
@@ -1387,6 +1390,22 @@ public void getJwtAuthenticationConverterWhenDuplicateConverterBeansThenThrowsEx
13871390
.isThrownBy(jwtConfigurer::getJwtAuthenticationConverter);
13881391
}
13891392

1393+
@Test
1394+
public void getWhenCustomAuthenticationConverterThenConverts() throws Exception {
1395+
this.spring.register(RestOperationsConfig.class, OpaqueTokenAuthenticationConverterConfig.class,
1396+
BasicController.class).autowire();
1397+
OpaqueTokenAuthenticationConverter authenticationConverter = this.spring.getContext()
1398+
.getBean(OpaqueTokenAuthenticationConverter.class);
1399+
given(authenticationConverter.convert(anyString(), any(OAuth2AuthenticatedPrincipal.class)))
1400+
.willReturn(new TestingAuthenticationToken("jdoe", null, Collections.emptyList()));
1401+
mockRestOperations(json("Active"));
1402+
// @formatter:off
1403+
this.mvc.perform(get("/authenticated").with(bearerToken("token")))
1404+
.andExpect(status().isOk())
1405+
.andExpect(content().string("jdoe"));
1406+
// @formatter:on
1407+
}
1408+
13901409
private static <T> void registerMockBean(GenericApplicationContext context, String name, Class<T> clazz) {
13911410
context.registerBean(name, clazz, () -> mock(clazz));
13921411
}
@@ -2441,6 +2460,30 @@ protected void configure(HttpSecurity http) throws Exception {
24412460

24422461
}
24432462

2463+
@EnableWebSecurity
2464+
static class OpaqueTokenAuthenticationConverterConfig extends WebSecurityConfigurerAdapter {
2465+
2466+
@Override
2467+
protected void configure(HttpSecurity http) throws Exception {
2468+
// @formatter:off
2469+
http
2470+
.authorizeRequests()
2471+
.antMatchers("/requires-read-scope").hasAuthority("SCOPE_message:read")
2472+
.anyRequest().authenticated()
2473+
.and()
2474+
.oauth2ResourceServer()
2475+
.opaqueToken()
2476+
.authenticationConverter(authenticationConverter());
2477+
// @formatter:on
2478+
}
2479+
2480+
@Bean
2481+
OpaqueTokenAuthenticationConverter authenticationConverter() {
2482+
return mock(OpaqueTokenAuthenticationConverter.class);
2483+
}
2484+
2485+
}
2486+
24442487
@Configuration
24452488
static class JwtDecoderConfig {
24462489

0 commit comments

Comments
 (0)