Commit dfceede0 authored by Vedran Pavic's avatar Vedran Pavic Committed by Stephane Nicoll

Improve LDAP auto-configuration conditions

At present, auto-configuration of `LdapContextSource` is conditional on
presence of a `ContextSource` bean. However, there are valid use cases
which require multiple `ContextSource` bean, for instance
`PooledContextSource`. With the current arrangement, the
auto-configuration of `LdapContextSource` will back off if user provides
a `PooledContextSource` bean, while it would still be reasonable to
reuse the auto-configured `LdapContextSource`.

This commit improves `LdapContextSource` factory method return value and
condition to back off only if users actually provide a
`LdapContextSource` bean themselves.

See gh-13143
parent efda5ef3
...@@ -53,7 +53,7 @@ public class LdapAutoConfiguration { ...@@ -53,7 +53,7 @@ public class LdapAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public ContextSource ldapContextSource() { public LdapContextSource ldapContextSource() {
LdapContextSource source = new LdapContextSource(); LdapContextSource source = new LdapContextSource();
source.setUserDn(this.properties.getUsername()); source.setUserDn(this.properties.getUsername());
source.setPassword(this.properties.getPassword()); source.setPassword(this.properties.getPassword());
......
...@@ -58,7 +58,6 @@ import org.springframework.core.env.MutablePropertySources; ...@@ -58,7 +58,6 @@ import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource; import org.springframework.core.env.PropertySource;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.ldap.core.ContextSource;
import org.springframework.ldap.core.support.LdapContextSource; import org.springframework.ldap.core.support.LdapContextSource;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
...@@ -101,7 +100,7 @@ public class EmbeddedLdapAutoConfiguration { ...@@ -101,7 +100,7 @@ public class EmbeddedLdapAutoConfiguration {
@Bean @Bean
@DependsOn("directoryServer") @DependsOn("directoryServer")
@ConditionalOnMissingBean @ConditionalOnMissingBean
public ContextSource ldapContextSource() { public LdapContextSource ldapContextSource() {
LdapContextSource source = new LdapContextSource(); LdapContextSource source = new LdapContextSource();
if (hasCredentials(this.embeddedProperties.getCredential())) { if (hasCredentials(this.embeddedProperties.getCredential())) {
source.setUserDn(this.embeddedProperties.getCredential().getUsername()); source.setUserDn(this.embeddedProperties.getCredential().getUsername());
......
...@@ -20,9 +20,13 @@ import org.junit.Test; ...@@ -20,9 +20,13 @@ import org.junit.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.ldap.core.ContextSource; import org.springframework.ldap.core.ContextSource;
import org.springframework.ldap.core.LdapTemplate; import org.springframework.ldap.core.LdapTemplate;
import org.springframework.ldap.core.support.LdapContextSource; import org.springframework.ldap.core.support.LdapContextSource;
import org.springframework.ldap.pool2.factory.PoolConfig;
import org.springframework.ldap.pool2.factory.PooledContextSource;
import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.util.ReflectionTestUtils;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
...@@ -54,7 +58,8 @@ public class LdapAutoConfigurationTests { ...@@ -54,7 +58,8 @@ public class LdapAutoConfigurationTests {
public void contextSourceWithSingleUrl() { public void contextSourceWithSingleUrl() {
this.contextRunner.withPropertyValues("spring.ldap.urls:ldap://localhost:123") this.contextRunner.withPropertyValues("spring.ldap.urls:ldap://localhost:123")
.run((context) -> { .run((context) -> {
ContextSource contextSource = context.getBean(ContextSource.class); ContextSource contextSource = context
.getBean(LdapContextSource.class);
String[] urls = (String[]) ReflectionTestUtils.getField(contextSource, String[] urls = (String[]) ReflectionTestUtils.getField(contextSource,
"urls"); "urls");
assertThat(urls).containsExactly("ldap://localhost:123"); assertThat(urls).containsExactly("ldap://localhost:123");
...@@ -67,7 +72,8 @@ public class LdapAutoConfigurationTests { ...@@ -67,7 +72,8 @@ public class LdapAutoConfigurationTests {
.withPropertyValues( .withPropertyValues(
"spring.ldap.urls:ldap://localhost:123,ldap://mycompany:123") "spring.ldap.urls:ldap://localhost:123,ldap://mycompany:123")
.run((context) -> { .run((context) -> {
ContextSource contextSource = context.getBean(ContextSource.class); ContextSource contextSource = context
.getBean(LdapContextSource.class);
LdapProperties ldapProperties = context.getBean(LdapProperties.class); LdapProperties ldapProperties = context.getBean(LdapProperties.class);
String[] urls = (String[]) ReflectionTestUtils.getField(contextSource, String[] urls = (String[]) ReflectionTestUtils.getField(contextSource,
"urls"); "urls");
...@@ -104,4 +110,32 @@ public class LdapAutoConfigurationTests { ...@@ -104,4 +110,32 @@ public class LdapAutoConfigurationTests {
.run(context -> assertThat(context).hasSingleBean(LdapTemplate.class)); .run(context -> assertThat(context).hasSingleBean(LdapTemplate.class));
} }
@Test
public void contextSourceWithUserProvidedPooledContextSource() {
this.contextRunner.withUserConfiguration(PooledContextSourceConfig.class)
.run((context) -> {
LdapContextSource contextSource = context
.getBean(LdapContextSource.class);
String[] urls = (String[]) ReflectionTestUtils.getField(contextSource,
"urls");
assertThat(urls).containsExactly("ldap://localhost:389");
assertThat(contextSource.isAnonymousReadOnly()).isFalse();
context.getBean(PooledContextSource.class);
});
}
@Configuration
static class PooledContextSourceConfig {
@Bean
public PooledContextSource pooledContextSource(
LdapContextSource ldapContextSource) {
PooledContextSource pooledContextSource = new PooledContextSource(
new PoolConfig());
pooledContextSource.setContextSource(ldapContextSource);
return pooledContextSource;
}
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment