Skip to content

Add support for LdapContextSource#referral property #44850

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@
package org.springframework.boot.autoconfigure.ldap;

import java.util.Collections;
import java.util.Optional;

import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.ldap.LdapProperties.Referral;
import org.springframework.boot.autoconfigure.ldap.LdapProperties.Template;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.context.properties.PropertyMapper;
Expand Down Expand Up @@ -67,6 +69,7 @@ public LdapContextSource ldapContextSource(LdapConnectionDetails connectionDetai
propertyMapper.from(connectionDetails.getUsername()).to(source::setUserDn);
propertyMapper.from(connectionDetails.getPassword()).to(source::setPassword);
propertyMapper.from(properties.getAnonymousReadOnly()).to(source::setAnonymousReadOnly);
Optional.ofNullable(properties.getReferral()).map(Referral::getMode).ifPresent(source::setReferral);
propertyMapper.from(connectionDetails.getBase()).to(source::setBase);
propertyMapper.from(connectionDetails.getUrls()).to(source::setUrls);
propertyMapper.from(properties.getBaseEnvironment())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.core.env.Environment;
import org.springframework.ldap.ReferralException;
import org.springframework.ldap.core.LdapTemplate;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
Expand Down Expand Up @@ -62,6 +63,11 @@ public class LdapProperties {
*/
private Boolean anonymousReadOnly;

/**
* Set the method to handle referrals.
*/
private Referral referral;

/**
* LDAP specification settings.
*/
Expand Down Expand Up @@ -109,6 +115,14 @@ public void setAnonymousReadOnly(Boolean anonymousReadOnly) {
this.anonymousReadOnly = anonymousReadOnly;
}

public Referral getReferral() {
return this.referral;
}

public void setReferral(Referral referral) {
this.referral = referral;
}

public Map<String, String> getBaseEnvironment() {
return this.baseEnvironment;
}
Expand Down Expand Up @@ -182,4 +196,36 @@ public void setIgnoreSizeLimitExceededException(Boolean ignoreSizeLimitExceededE

}

/**
* Enum to define how referrals encountered by the service provider are to be processed.
*/
public enum Referral {

/**
* follow referrals automatically
*/
FOLLOW("follow"),

/**
* ignore referrals
*/
IGNORE("ignore"),

/**
* throw a {@link ReferralException} for each referral
*/
THROW("throw");

private final String mode;

Referral(String mode) {
this.mode = mode;
}

public String getMode() {
return this.mode;
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.springframework.test.util.ReflectionTestUtils.getField;

/**
* Tests for {@link LdapAutoConfiguration}.
Expand Down Expand Up @@ -88,6 +89,14 @@ void contextSourceWithUserDoesNotEnableAnonymousReadOnly() {
});
}

@Test
void contextSourceWithReferral() {
this.contextRunner.withPropertyValues("spring.ldap.referral:ignore").run((context) -> {
LdapContextSource contextSource = context.getBean(LdapContextSource.class);
assertThat(getField(contextSource, "referral")).isEqualTo("ignore");
});
}

@Test
void contextSourceWithExtraCustomization() {
this.contextRunner
Expand Down