diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/servlet/SecurityAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/servlet/SecurityAutoConfigurationTests.java index eecf08ae28f..810c0b34034 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/servlet/SecurityAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/servlet/SecurityAutoConfigurationTests.java @@ -16,6 +16,8 @@ package org.springframework.boot.autoconfigure.security.servlet; +import java.security.interfaces.RSAPublicKey; + import javax.servlet.DispatcherType; import org.assertj.core.api.InstanceOfAssertFactories; @@ -27,6 +29,10 @@ import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoCon import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.test.City; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.ConfigurationPropertiesBinding; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.convert.ApplicationConversionService; import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.WebApplicationContextRunner; import org.springframework.boot.web.servlet.DelegatingFilterProxyRegistrationBean; @@ -34,6 +40,7 @@ import org.springframework.boot.web.servlet.filter.OrderedFilter; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.convert.converter.Converter; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.security.authentication.AuthenticationEventPublisher; import org.springframework.security.authentication.DefaultAuthenticationEventPublisher; @@ -200,6 +207,23 @@ class SecurityAutoConfigurationTests { }); } + @Test + void whenAConfigurationPropertyBindingConverterIsDefinedThenBindingToAnRsaKeySucceeds() { + this.contextRunner.withUserConfiguration(ConverterConfiguration.class, PropertiesConfiguration.class) + .withPropertyValues("jwt.public-key=classpath:public-key-location") + .run((context) -> assertThat(context.getBean(JwtProperties.class).getPublicKey()).isNotNull()); + } + + @Test + void whenTheBeanFactoryHasAConversionServiceAndAConfigurationPropertyBindingConverterIsDefinedThenBindingToAnRsaKeySucceeds() { + this.contextRunner + .withInitializer( + (context) -> context.getBeanFactory().setConversionService(new ApplicationConversionService())) + .withUserConfiguration(ConverterConfiguration.class, PropertiesConfiguration.class) + .withPropertyValues("jwt.public-key=classpath:public-key-location") + .run((context) -> assertThat(context.getBean(JwtProperties.class).getPublicKey()).isNotNull()); + } + @Configuration(proxyBeanMethods = false) @TestAutoConfigurationPackage(City.class) static class EntityConfiguration { @@ -248,4 +272,47 @@ class SecurityAutoConfigurationTests { } + @Configuration(proxyBeanMethods = false) + static class ConverterConfiguration { + + @Bean + @ConfigurationPropertiesBinding + Converter targetTypeConverter() { + return new Converter() { + + @Override + public TargetType convert(String input) { + return new TargetType(); + } + + }; + } + + } + + @Configuration(proxyBeanMethods = false) + @EnableConfigurationProperties(JwtProperties.class) + static class PropertiesConfiguration { + + } + + @ConfigurationProperties("jwt") + static class JwtProperties { + + private RSAPublicKey publicKey; + + RSAPublicKey getPublicKey() { + return this.publicKey; + } + + void setPublicKey(RSAPublicKey publicKey) { + this.publicKey = publicKey; + } + + } + + static class TargetType { + + } + }