diff --git a/config/src/integration-test/java/org/springframework/security/config/annotation/authentication/ldap/NamespaceLdapAuthenticationProviderTests.groovy b/config/src/integration-test/java/org/springframework/security/config/annotation/authentication/ldap/NamespaceLdapAuthenticationProviderTests.groovy index 6a8fd83b1d..7501dc6986 100644 --- a/config/src/integration-test/java/org/springframework/security/config/annotation/authentication/ldap/NamespaceLdapAuthenticationProviderTests.groovy +++ b/config/src/integration-test/java/org/springframework/security/config/annotation/authentication/ldap/NamespaceLdapAuthenticationProviderTests.groovy @@ -26,6 +26,7 @@ import org.springframework.security.config.annotation.authentication.builders.Au import org.springframework.security.config.annotation.authentication.ldap.NamespaceLdapAuthenticationProviderTestsConfigs.LdapAuthenticationProviderConfig; import org.springframework.security.ldap.authentication.LdapAuthenticationProvider; import org.springframework.security.ldap.authentication.PasswordComparisonAuthenticator; +import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator; import org.springframework.security.ldap.userdetails.PersonContextMapper; import org.springframework.test.util.ReflectionTestUtils; @@ -57,6 +58,17 @@ class NamespaceLdapAuthenticationProviderTests extends BaseSpringSpec { provider.authenticator.userSearch.searchFilter == "(uid={0})" } + def "SEC-2490: ldap-authentication-provider custom LdapAuthoritiesPopulator"() { + setup: + LdapAuthoritiesPopulator LAP = Mock() + CustomAuthoritiesPopulatorConfig.LAP = LAP + when: + loadConfig(CustomAuthoritiesPopulatorConfig) + LdapAuthenticationProvider provider = findAuthenticationProvider(LdapAuthenticationProvider) + then: + provider.authoritiesPopulator == LAP + } + def "ldap-authentication-provider password compare"() { when: loadConfig(PasswordCompareLdapConfig) diff --git a/config/src/integration-test/java/org/springframework/security/config/annotation/authentication/ldap/NamespaceLdapAuthenticationProviderTestsConfigs.java b/config/src/integration-test/java/org/springframework/security/config/annotation/authentication/ldap/NamespaceLdapAuthenticationProviderTestsConfigs.java index 952ded6415..2ef0c08969 100644 --- a/config/src/integration-test/java/org/springframework/security/config/annotation/authentication/ldap/NamespaceLdapAuthenticationProviderTestsConfigs.java +++ b/config/src/integration-test/java/org/springframework/security/config/annotation/authentication/ldap/NamespaceLdapAuthenticationProviderTestsConfigs.java @@ -20,6 +20,7 @@ import org.springframework.security.authentication.encoding.PlaintextPasswordEnc import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator; import org.springframework.security.ldap.userdetails.PersonContextMapper; /** @@ -65,6 +66,18 @@ public class NamespaceLdapAuthenticationProviderTestsConfigs { } } + @Configuration + @EnableWebSecurity + static class CustomAuthoritiesPopulatorConfig extends WebSecurityConfigurerAdapter { + static LdapAuthoritiesPopulator LAP; + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth + .ldapAuthentication() + .userSearchFilter("(uid={0})") + .ldapAuthoritiesPopulator(LAP); + } + } + @Configuration @EnableWebSecurity static class PasswordCompareLdapConfig extends WebSecurityConfigurerAdapter { diff --git a/config/src/main/java/org/springframework/security/config/annotation/authentication/configurers/ldap/LdapAuthenticationProviderConfigurer.java b/config/src/main/java/org/springframework/security/config/annotation/authentication/configurers/ldap/LdapAuthenticationProviderConfigurer.java index ab9b3aa364..7e5f761371 100644 --- a/config/src/main/java/org/springframework/security/config/annotation/authentication/configurers/ldap/LdapAuthenticationProviderConfigurer.java +++ b/config/src/main/java/org/springframework/security/config/annotation/authentication/configurers/ldap/LdapAuthenticationProviderConfigurer.java @@ -36,6 +36,7 @@ import org.springframework.security.ldap.search.LdapUserSearch; import org.springframework.security.ldap.server.ApacheDSContainer; import org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator; import org.springframework.security.ldap.userdetails.InetOrgPersonContextMapper; +import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator; import org.springframework.security.ldap.userdetails.LdapUserDetailsMapper; import org.springframework.security.ldap.userdetails.PersonContextMapper; import org.springframework.security.ldap.userdetails.UserDetailsContextMapper; @@ -61,15 +62,13 @@ public class LdapAuthenticationProviderConfigurer ldapAuthoritiesPopulator(LdapAuthoritiesPopulator ldapAuthoritiesPopulator) { + this.ldapAuthoritiesPopulator = ldapAuthoritiesPopulator; + return this; + } + /** * Adds an {@link ObjectPostProcessor} for this class. * @@ -94,6 +104,25 @@ public class LdapAuthenticationProviderConfigurer