Move configuration of ConfigurationPropertiesReportEndpoint

See gh-10263
pull/10278/merge
Stephane Nicoll 7 years ago
parent 0d62b0cb3c
commit bb622292ba

@ -20,6 +20,7 @@ import org.springframework.boot.actuate.autoconfigure.endpoint.condition.Conditi
import org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpoint;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@ -28,16 +29,30 @@ import org.springframework.context.annotation.Configuration;
* {@link ConfigurationPropertiesReportEndpoint}.
*
* @author Phillip Webb
* @author Stephane Nicoll
* @since 2.0.0
*/
@Configuration
@EnableConfigurationProperties(ConfigurationPropertiesReportEndpointProperties.class)
public class ConfigurationPropertiesReportEndpointAutoConfiguration {
private final ConfigurationPropertiesReportEndpointProperties properties;
public ConfigurationPropertiesReportEndpointAutoConfiguration(
ConfigurationPropertiesReportEndpointProperties properties) {
this.properties = properties;
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnEnabledEndpoint
public ConfigurationPropertiesReportEndpoint configurationPropertiesReportEndpoint() {
return new ConfigurationPropertiesReportEndpoint();
ConfigurationPropertiesReportEndpoint endpoint = new ConfigurationPropertiesReportEndpoint();
String[] keysToSanitize = this.properties.getKeysToSanitize();
if (keysToSanitize != null) {
endpoint.setKeysToSanitize(keysToSanitize);
}
return endpoint;
}
}

@ -0,0 +1,45 @@
/*
* Copyright 2012-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.actuate.autoconfigure.context.properties;
import org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpoint;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* Configuration properties for {@link ConfigurationPropertiesReportEndpoint}.
*
* @author Stephane Nicoll
* @since 2.0.0
*/
@ConfigurationProperties("endpoints.configprops")
public class ConfigurationPropertiesReportEndpointProperties {
/**
* Keys that should be sanitized. Keys can be simple strings that the property ends
* with or regex expressions.
*/
private String[] keysToSanitize;
public String[] getKeysToSanitize() {
return this.keysToSanitize;
}
public void setKeysToSanitize(String[] keysToSanitize) {
this.keysToSanitize = keysToSanitize;
}
}

@ -1,9 +1,6 @@
{"properties": [
{
"name": "endpoints.configprops.keys-to-sanitize",
"type": "java.lang.String[]",
"sourceType": "org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpoint",
"description": "Keys that should be sanitized. Keys can be simple strings that the property ends with or regex expressions.",
"defaultValue": [
"password",
"secret",

@ -16,11 +16,20 @@
package org.springframework.boot.actuate.autoconfigure.context.properties;
import java.util.Map;
import org.junit.Test;
import org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpoint;
import org.springframework.boot.actuate.context.properties.ConfigurationPropertiesReportEndpoint.ConfigurationPropertiesDescriptor;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.boot.test.context.runner.ContextConsumer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import static org.assertj.core.api.Assertions.assertThat;
@ -37,8 +46,8 @@ public class ConfigurationPropertiesReportEndpointAutoConfigurationTests {
@Test
public void runShouldHaveEndpointBean() {
this.contextRunner.run((context) -> assertThat(context)
.hasSingleBean(ConfigurationPropertiesReportEndpoint.class));
this.contextRunner.withUserConfiguration(Config.class)
.run(validateTestProperties("******", "654321"));
}
@Test
@ -49,4 +58,64 @@ public class ConfigurationPropertiesReportEndpointAutoConfigurationTests {
.doesNotHaveBean(ConfigurationPropertiesReportEndpoint.class));
}
@Test
public void keysToSanitizeCanBeConfiguredViaTheEnvironment() throws Exception {
this.contextRunner.withUserConfiguration(Config.class)
.withPropertyValues("endpoints.configprops.keys-to-sanitize: .*pass.*, property")
.run(validateTestProperties("******", "******"));
}
private ContextConsumer<AssertableApplicationContext> validateTestProperties(String dbPassword,
String myTestProperty) {
return context -> {
assertThat(context).hasSingleBean(
ConfigurationPropertiesReportEndpoint.class);
ConfigurationPropertiesReportEndpoint endpoint = context
.getBean(ConfigurationPropertiesReportEndpoint.class);
ConfigurationPropertiesDescriptor properties = endpoint
.configurationProperties();
Map<String, Object> nestedProperties = properties.getBeans()
.get("testProperties").getProperties();
assertThat(nestedProperties).isNotNull();
assertThat(nestedProperties.get("dbPassword")).isEqualTo(dbPassword);
assertThat(nestedProperties.get("myTestProperty")).isEqualTo(myTestProperty);
};
}
@Configuration
@EnableConfigurationProperties
public static class Config {
@Bean
public TestProperties testProperties() {
return new TestProperties();
}
}
@ConfigurationProperties("test")
private static class TestProperties {
private String dbPassword = "123456";
private String myTestProperty = "654321";
public String getDbPassword() {
return this.dbPassword;
}
public void setDbPassword(String dbPassword) {
this.dbPassword = dbPassword;
}
public String getMyTestProperty() {
return this.myTestProperty;
}
public void setMyTestProperty(String myTestProperty) {
this.myTestProperty = myTestProperty;
}
}
}

@ -66,7 +66,6 @@ import org.springframework.util.StringUtils;
* @since 2.0.0
*/
@Endpoint(id = "configprops")
@ConfigurationProperties("endpoints.configprops")
public class ConfigurationPropertiesReportEndpoint implements ApplicationContextAware {
private static final String CGLIB_FILTER_ID = "cglibFilter";

@ -48,7 +48,7 @@ public class ConfigurationPropertiesReportEndpointParentTests {
ConfigurationPropertiesDescriptor result = endpoint
.configurationProperties();
assertThat(result.getBeans().keySet())
.containsExactlyInAnyOrder("endpoint", "someProperties");
.containsExactlyInAnyOrder("someProperties");
assertThat((result.getParent().getBeans().keySet()))
.containsExactly("testProperties");
});
@ -68,7 +68,7 @@ public class ConfigurationPropertiesReportEndpointParentTests {
ConfigurationPropertiesDescriptor result = endpoint
.configurationProperties();
assertThat(result.getBeans().keySet())
.containsExactlyInAnyOrder("endpoint", "otherProperties");
.containsExactlyInAnyOrder("otherProperties");
assertThat((result.getParent().getBeans().keySet()))
.containsExactly("testProperties");
});

@ -100,25 +100,6 @@ public class ConfigurationPropertiesReportEndpointTests {
});
}
@Test
public void keysToSanitizeCanBeConfiguredViaTheEnvironment() throws Exception {
ApplicationContextRunner tester = new ApplicationContextRunner()
.withPropertyValues(
"endpoints.configprops.keys-to-sanitize: .*pass.*, property")
.withUserConfiguration(Config.class);
tester.run((context) -> {
ConfigurationPropertiesReportEndpoint endpoint = context
.getBean(ConfigurationPropertiesReportEndpoint.class);
ConfigurationPropertiesDescriptor properties = endpoint
.configurationProperties();
Map<String, Object> nestedProperties = properties.getBeans()
.get("testProperties").getProperties();
assertThat(nestedProperties).isNotNull();
assertThat(nestedProperties.get("dbPassword")).isEqualTo("******");
assertThat(nestedProperties.get("myTestProperty")).isEqualTo("******");
});
}
@Test
@SuppressWarnings("unchecked")
public void keySanitizationWithCustomPatternUsingCompositeKeys() throws Exception {

Loading…
Cancel
Save