Skip to content

Commit ee735a6

Browse files
committed
Polish
See gh-15814
1 parent f42b619 commit ee735a6

File tree

6 files changed

+47
-17
lines changed

6 files changed

+47
-17
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public ConditionOutcome getMatchOutcome(ConditionContext context,
4242
"spring.security.oauth2.resourceserver.jwt.public-key-location");
4343
if (!StringUtils.hasText(publicKeyLocation)) {
4444
return ConditionOutcome
45-
.noMatch(message.didNotFind("issuer-uri property").atAll());
45+
.noMatch(message.didNotFind("public-key-location property").atAll());
4646
}
4747
String issuerUri = environment
4848
.getProperty("spring.security.oauth2.resourceserver.jwt.issuer-uri");

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

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2018 the original author or authors.
2+
* Copyright 2012-2019 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.
@@ -15,7 +15,15 @@
1515
*/
1616
package org.springframework.boot.autoconfigure.security.oauth2.resource;
1717

18+
import java.io.IOException;
19+
import java.io.InputStream;
20+
import java.nio.charset.StandardCharsets;
21+
1822
import org.springframework.boot.context.properties.ConfigurationProperties;
23+
import org.springframework.boot.context.properties.source.InvalidConfigurationPropertyValueException;
24+
import org.springframework.core.io.Resource;
25+
import org.springframework.util.Assert;
26+
import org.springframework.util.StreamUtils;
1927

2028
/**
2129
* OAuth 2.0 resource server properties.
@@ -53,7 +61,7 @@ public static class Jwt {
5361
/**
5462
* Location of the file containing the public key used to verify a JWT.
5563
*/
56-
private String publicKeyLocation;
64+
private Resource publicKeyLocation;
5765

5866
public String getJwkSetUri() {
5967
return this.jwkSetUri;
@@ -79,14 +87,26 @@ public void setIssuerUri(String issuerUri) {
7987
this.issuerUri = issuerUri;
8088
}
8189

82-
public String getPublicKeyLocation() {
90+
public Resource getPublicKeyLocation() {
8391
return this.publicKeyLocation;
8492
}
8593

86-
public void setPublicKeyLocation(String publicKeyLocation) {
94+
public void setPublicKeyLocation(Resource publicKeyLocation) {
8795
this.publicKeyLocation = publicKeyLocation;
8896
}
8997

98+
public String readPublicKey() throws IOException {
99+
String key = "spring.security.oauth2.resourceserver.public-key-location";
100+
Assert.notNull(this.publicKeyLocation, "PublicKeyLocation must not be null");
101+
if (!this.publicKeyLocation.exists()) {
102+
throw new InvalidConfigurationPropertyValueException(key,
103+
this.publicKeyLocation, "Public key location does not exist");
104+
}
105+
try (InputStream inputStream = this.publicKeyLocation.getInputStream()) {
106+
return StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
107+
}
108+
}
109+
90110
}
91111

92112
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/reactive/ReactiveOAuth2ResourceServerJwkConfiguration.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package org.springframework.boot.autoconfigure.security.oauth2.resource.reactive;
1717

18-
import java.io.InputStreamReader;
1918
import java.security.KeyFactory;
2019
import java.security.interfaces.RSAPublicKey;
2120
import java.security.spec.X509EncodedKeySpec;
@@ -32,8 +31,6 @@
3231
import org.springframework.security.oauth2.jwt.NimbusReactiveJwtDecoder;
3332
import org.springframework.security.oauth2.jwt.ReactiveJwtDecoder;
3433
import org.springframework.security.oauth2.jwt.ReactiveJwtDecoders;
35-
import org.springframework.util.FileCopyUtils;
36-
import org.springframework.util.ResourceUtils;
3734

3835
/**
3936
* Configures a {@link ReactiveJwtDecoder} when a JWK Set URI, OpenID Connect Issuer URI
@@ -63,10 +60,9 @@ public ReactiveJwtDecoder jwtDecoder() {
6360
@Conditional(KeyValueCondition.class)
6461
@ConditionalOnMissingBean
6562
public NimbusReactiveJwtDecoder jwtDecoderByPublicKeyValue() throws Exception {
66-
String keyValue = FileCopyUtils.copyToString(new InputStreamReader(ResourceUtils
67-
.getURL(this.properties.getPublicKeyLocation()).openStream()));
6863
RSAPublicKey publicKey = (RSAPublicKey) KeyFactory.getInstance("RSA")
69-
.generatePublic(new X509EncodedKeySpec(getKeySpec(keyValue)));
64+
.generatePublic(new X509EncodedKeySpec(
65+
getKeySpec(this.properties.readPublicKey())));
7066
return NimbusReactiveJwtDecoder.withPublicKey(publicKey).build();
7167
}
7268

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/servlet/OAuth2ResourceServerJwtConfiguration.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
*/
1616
package org.springframework.boot.autoconfigure.security.oauth2.resource.servlet;
1717

18-
import java.io.InputStreamReader;
1918
import java.security.KeyFactory;
2019
import java.security.interfaces.RSAPublicKey;
2120
import java.security.spec.X509EncodedKeySpec;
@@ -32,8 +31,6 @@
3231
import org.springframework.security.oauth2.jwt.JwtDecoder;
3332
import org.springframework.security.oauth2.jwt.JwtDecoders;
3433
import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
35-
import org.springframework.util.FileCopyUtils;
36-
import org.springframework.util.ResourceUtils;
3734

3835
/**
3936
* Configures a {@link JwtDecoder} when a JWK Set URI, OpenID Connect Issuer URI or Public
@@ -63,10 +60,9 @@ public JwtDecoder jwtDecoderByJwkKeySetUri() {
6360
@Conditional(KeyValueCondition.class)
6461
@ConditionalOnMissingBean
6562
public JwtDecoder jwtDecoderByPublicKeyValue() throws Exception {
66-
String keyValue = FileCopyUtils.copyToString(new InputStreamReader(ResourceUtils
67-
.getURL(this.properties.getPublicKeyLocation()).openStream()));
6863
RSAPublicKey publicKey = (RSAPublicKey) KeyFactory.getInstance("RSA")
69-
.generatePublic(new X509EncodedKeySpec(getKeySpec(keyValue)));
64+
.generatePublic(new X509EncodedKeySpec(
65+
getKeySpec(this.properties.readPublicKey())));
7066
return NimbusJwtDecoder.withPublicKey(publicKey).build();
7167
}
7268

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/oauth2/resource/reactive/ReactiveOAuth2ResourceServerAutoConfigurationTests.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,15 @@ public void autoConfigurationShouldConfigureResourceServerUsingPublicKeyValue()
115115
});
116116
}
117117

118+
@Test
119+
public void autoConfigurationShouldFailIfPublicKeyLocationDoesNotExist() {
120+
this.contextRunner.withPropertyValues(
121+
"spring.security.oauth2.resourceserver.jwt.public-key-location=classpath:does-not-exist")
122+
.run((context) -> assertThat(context).hasFailed().getFailure()
123+
.hasMessageContaining("class path resource [does-not-exist]")
124+
.hasMessageContaining("Public key location does not exist"));
125+
}
126+
118127
@Test
119128
public void autoConfigurationWhenSetUriKeyLocationIssuerUriPresentShouldUseSetUri() {
120129
this.contextRunner.withPropertyValues(

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/oauth2/resource/servlet/OAuth2ResourceServerAutoConfigurationTests.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,15 @@ public void autoConfigurationShouldConfigureResourceServerUsingPublicKeyValue()
149149
});
150150
}
151151

152+
@Test
153+
public void autoConfigurationShouldFailIfPublicKeyLocationDoesNotExist() {
154+
this.contextRunner.withPropertyValues(
155+
"spring.security.oauth2.resourceserver.jwt.public-key-location=classpath:does-not-exist")
156+
.run((context) -> assertThat(context).hasFailed().getFailure()
157+
.hasMessageContaining("class path resource [does-not-exist]")
158+
.hasMessageContaining("Public key location does not exist"));
159+
}
160+
152161
@Test
153162
public void autoConfigurationWhenSetUriKeyLocationAndIssuerUriPresentShouldUseSetUri() {
154163
this.contextRunner.withPropertyValues(

0 commit comments

Comments
 (0)