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
This commit is contained in:
parent
efda5ef3ac
commit
dfceede0bc
|
@ -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;
|
||||||
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 {
|
||||||
@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;
|
||||||
|
|
||||||
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 {
|
||||||
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 {
|
||||||
.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 {
|
||||||
.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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue