Skip to content

Commit f5f6546

Browse files
walterjsphilwebb
authored andcommitted
Fail fast on getKeyFromServer() failure
Update `ResourceServerTokenServicesConfiguration` to fail fast if the `getKeyFromServer()` call fails. Since the key is part of the singleton `JwtAccessTokenConverter` bean there is not real way to refresh without restarting the application. A hard failure seems preferable to an inconsistent state. Closes gh-8924
1 parent 8eb79b3 commit f5f6546

File tree

2 files changed

+28
-29
lines changed

2 files changed

+28
-29
lines changed

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/ResourceServerTokenServicesConfiguration.java

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@
2121
import java.util.List;
2222
import java.util.Map;
2323

24-
import org.apache.commons.logging.Log;
25-
import org.apache.commons.logging.LogFactory;
26-
2724
import org.springframework.beans.factory.ObjectProvider;
2825
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
2926
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
@@ -68,7 +65,6 @@
6865
import org.springframework.util.CollectionUtils;
6966
import org.springframework.util.MultiValueMap;
7067
import org.springframework.util.StringUtils;
71-
import org.springframework.web.client.ResourceAccessException;
7268
import org.springframework.web.client.RestTemplate;
7369

7470
/**
@@ -83,9 +79,6 @@
8379
@ConditionalOnMissingBean(AuthorizationServerEndpointsConfiguration.class)
8480
public class ResourceServerTokenServicesConfiguration {
8581

86-
private static final Log logger = LogFactory
87-
.getLog(ResourceServerTokenServicesConfiguration.class);
88-
8982
@Bean
9083
@ConditionalOnMissingBean
9184
public UserInfoRestTemplateFactory userInfoRestTemplateFactory(
@@ -278,13 +271,7 @@ public JwtAccessTokenConverter jwtTokenEnhancer() {
278271
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
279272
String keyValue = this.resource.getJwt().getKeyValue();
280273
if (!StringUtils.hasText(keyValue)) {
281-
try {
282-
keyValue = getKeyFromServer();
283-
}
284-
catch (ResourceAccessException ex) {
285-
logger.warn("Failed to fetch token key (you may need to refresh "
286-
+ "when the auth server is back)");
287-
}
274+
keyValue = getKeyFromServer();
288275
}
289276
if (StringUtils.hasText(keyValue) && !keyValue.startsWith("-----BEGIN")) {
290277
converter.setSigningKey(keyValue);

spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/oauth2/resource/ResourceServerTokenServicesConfigurationTests.java

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,12 @@
4545
import org.springframework.core.env.ConfigurableEnvironment;
4646
import org.springframework.core.env.StandardEnvironment;
4747
import org.springframework.http.HttpRequest;
48+
import org.springframework.http.HttpStatus;
49+
import org.springframework.http.MediaType;
4850
import org.springframework.http.client.ClientHttpRequestExecution;
4951
import org.springframework.http.client.ClientHttpRequestInterceptor;
5052
import org.springframework.http.client.ClientHttpResponse;
53+
import org.springframework.mock.http.client.MockClientHttpResponse;
5154
import org.springframework.security.core.GrantedAuthority;
5255
import org.springframework.security.core.authority.AuthorityUtils;
5356
import org.springframework.security.oauth2.client.OAuth2RestTemplate;
@@ -60,9 +63,7 @@
6063
import org.springframework.web.client.RestTemplate;
6164

6265
import static org.assertj.core.api.Assertions.assertThat;
63-
import static org.mockito.Matchers.any;
6466
import static org.mockito.Mockito.mock;
65-
import static org.mockito.Mockito.verify;
6667

6768
/**
6869
* Tests for {@link ResourceServerTokenServicesConfiguration}.
@@ -247,23 +248,12 @@ public void customUserInfoRestTemplateFactory() {
247248

248249
@Test
249250
public void jwtAccessTokenConverterIsConfiguredWhenKeyUriIsProvided() {
250-
EnvironmentTestUtils.addEnvironment(this.environment,
251-
"security.oauth2.resource.jwt.key-uri=http://localhost:12345/banana");
252-
this.context = new SpringApplicationBuilder(ResourceConfiguration.class)
253-
.environment(this.environment).web(false).run();
254-
assertThat(this.context.getBeansOfType(JwtAccessTokenConverter.class)).hasSize(1);
255-
}
256-
257-
@Test
258-
public void jwtAccessTokenConverterRestTemplateCanBeCustomized() {
259251
EnvironmentTestUtils.addEnvironment(this.environment,
260252
"security.oauth2.resource.jwt.key-uri=http://localhost:12345/banana");
261253
this.context = new SpringApplicationBuilder(ResourceConfiguration.class,
262254
JwtAccessTokenConverterRestTemplateCustomizerConfiguration.class)
263255
.environment(this.environment).web(false).run();
264-
JwtAccessTokenConverterRestTemplateCustomizer customizer = this.context
265-
.getBean(JwtAccessTokenConverterRestTemplateCustomizer.class);
266-
verify(customizer).customize(any(RestTemplate.class));
256+
assertThat(this.context.getBeansOfType(JwtAccessTokenConverter.class)).hasSize(1);
267257
}
268258

269259
@Configuration
@@ -385,7 +375,29 @@ static class JwtAccessTokenConverterRestTemplateCustomizerConfiguration {
385375

386376
@Bean
387377
public JwtAccessTokenConverterRestTemplateCustomizer restTemplateCustomizer() {
388-
return mock(JwtAccessTokenConverterRestTemplateCustomizer.class);
378+
return new MockRestCallCustomizer();
379+
}
380+
381+
}
382+
383+
private static class MockRestCallCustomizer
384+
implements JwtAccessTokenConverterRestTemplateCustomizer {
385+
386+
@Override
387+
public void customize(RestTemplate template) {
388+
template.getInterceptors().add(new ClientHttpRequestInterceptor() {
389+
390+
@Override
391+
public ClientHttpResponse intercept(HttpRequest request, byte[] body,
392+
ClientHttpRequestExecution execution) throws IOException {
393+
String payload = "{\"value\":\"FOO\"}";
394+
MockClientHttpResponse response = new MockClientHttpResponse(
395+
payload.getBytes(), HttpStatus.OK);
396+
response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
397+
return response;
398+
}
399+
400+
});
389401
}
390402

391403
}

0 commit comments

Comments
 (0)