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
|
||||
@ConditionalOnMissingBean
|
||||
public ContextSource ldapContextSource() {
|
||||
public LdapContextSource ldapContextSource() {
|
||||
LdapContextSource source = new LdapContextSource();
|
||||
source.setUserDn(this.properties.getUsername());
|
||||
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.io.Resource;
|
||||
import org.springframework.core.type.AnnotatedTypeMetadata;
|
||||
import org.springframework.ldap.core.ContextSource;
|
||||
import org.springframework.ldap.core.support.LdapContextSource;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
|
@ -101,7 +100,7 @@ public class EmbeddedLdapAutoConfiguration {
|
|||
@Bean
|
||||
@DependsOn("directoryServer")
|
||||
@ConditionalOnMissingBean
|
||||
public ContextSource ldapContextSource() {
|
||||
public LdapContextSource ldapContextSource() {
|
||||
LdapContextSource source = new LdapContextSource();
|
||||
if (hasCredentials(this.embeddedProperties.getCredential())) {
|
||||
source.setUserDn(this.embeddedProperties.getCredential().getUsername());
|
||||
|
|
|
@ -20,9 +20,13 @@ import org.junit.Test;
|
|||
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
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.LdapTemplate;
|
||||
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 static org.assertj.core.api.Assertions.assertThat;
|
||||
|
@ -54,7 +58,8 @@ public class LdapAutoConfigurationTests {
|
|||
public void contextSourceWithSingleUrl() {
|
||||
this.contextRunner.withPropertyValues("spring.ldap.urls:ldap://localhost:123")
|
||||
.run((context) -> {
|
||||
ContextSource contextSource = context.getBean(ContextSource.class);
|
||||
ContextSource contextSource = context
|
||||
.getBean(LdapContextSource.class);
|
||||
String[] urls = (String[]) ReflectionTestUtils.getField(contextSource,
|
||||
"urls");
|
||||
assertThat(urls).containsExactly("ldap://localhost:123");
|
||||
|
@ -67,7 +72,8 @@ public class LdapAutoConfigurationTests {
|
|||
.withPropertyValues(
|
||||
"spring.ldap.urls:ldap://localhost:123,ldap://mycompany:123")
|
||||
.run((context) -> {
|
||||
ContextSource contextSource = context.getBean(ContextSource.class);
|
||||
ContextSource contextSource = context
|
||||
.getBean(LdapContextSource.class);
|
||||
LdapProperties ldapProperties = context.getBean(LdapProperties.class);
|
||||
String[] urls = (String[]) ReflectionTestUtils.getField(contextSource,
|
||||
"urls");
|
||||
|
@ -104,4 +110,32 @@ public class LdapAutoConfigurationTests {
|
|||
.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