|
@@ -16,12 +16,19 @@
|
|
|
|
|
|
package org.springframework.security.ldap.authentication;
|
|
package org.springframework.security.ldap.authentication;
|
|
|
|
|
|
|
|
+import javax.naming.Name;
|
|
|
|
+import javax.naming.ldap.LdapContext;
|
|
|
|
+
|
|
|
|
+import org.assertj.core.api.ThrowableAssert.ThrowingCallable;
|
|
import org.junit.jupiter.api.BeforeEach;
|
|
import org.junit.jupiter.api.BeforeEach;
|
|
import org.junit.jupiter.api.Test;
|
|
import org.junit.jupiter.api.Test;
|
|
import org.junit.jupiter.api.extension.ExtendWith;
|
|
import org.junit.jupiter.api.extension.ExtendWith;
|
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+import org.springframework.ldap.AuthenticationException;
|
|
import org.springframework.ldap.core.DirContextOperations;
|
|
import org.springframework.ldap.core.DirContextOperations;
|
|
|
|
+import org.springframework.ldap.core.support.BaseLdapPathContextSource;
|
|
|
|
+import org.springframework.ldap.support.LdapUtils;
|
|
import org.springframework.security.authentication.BadCredentialsException;
|
|
import org.springframework.security.authentication.BadCredentialsException;
|
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
|
import org.springframework.security.core.Authentication;
|
|
import org.springframework.security.core.Authentication;
|
|
@@ -34,6 +41,10 @@ import org.springframework.test.context.junit.jupiter.SpringExtension;
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
|
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
|
|
|
+import static org.mockito.ArgumentMatchers.any;
|
|
|
|
+import static org.mockito.BDDMockito.given;
|
|
|
|
+import static org.mockito.Mockito.mock;
|
|
|
|
+import static org.mockito.Mockito.spy;
|
|
|
|
|
|
/**
|
|
/**
|
|
* Tests for {@link BindAuthenticator}.
|
|
* Tests for {@link BindAuthenticator}.
|
|
@@ -142,4 +153,23 @@ public class BindAuthenticatorTests {
|
|
assertThat(this.authenticator.getUserDns("Joe").get(0)).isEqualTo("cn=Joe,ou=people");
|
|
assertThat(this.authenticator.getUserDns("Joe").get(0)).isEqualTo("cn=Joe,ou=people");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Test
|
|
|
|
+ public void setAlsoHandleJavaxNamingBindExceptionsWhenTrueThenHandles() throws Exception {
|
|
|
|
+ BaseLdapPathContextSource contextSource = spy(this.contextSource);
|
|
|
|
+ BindAuthenticator authenticator = new BindAuthenticator(contextSource);
|
|
|
|
+ authenticator.setUserDnPatterns(new String[] { "uid={0},ou=people" });
|
|
|
|
+ LdapContext dirContext = mock(LdapContext.class);
|
|
|
|
+ given(dirContext.getAttributes(any(Name.class), any())).willThrow(new javax.naming.AuthenticationException("exception"));
|
|
|
|
+ Name fullDn = LdapUtils.newLdapName("uid=bob,ou=people").addAll(0, contextSource.getBaseLdapPath());
|
|
|
|
+ given(contextSource.getContext(fullDn.toString(), (String) this.bob.getCredentials())).willReturn(dirContext);
|
|
|
|
+ authenticator.setAlsoHandleJavaxNamingBindExceptions(true);
|
|
|
|
+ assertThatExceptionOfType(BadCredentialsException.class).isThrownBy(authenticateBob(authenticator));
|
|
|
|
+ authenticator.setAlsoHandleJavaxNamingBindExceptions(false);
|
|
|
|
+ assertThatExceptionOfType(AuthenticationException.class).isThrownBy(authenticateBob(authenticator))
|
|
|
|
+ .withCauseInstanceOf(javax.naming.AuthenticationException.class);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private ThrowingCallable authenticateBob(BindAuthenticator authenticator) {
|
|
|
|
+ return () -> authenticator.authenticate(this.bob);
|
|
|
|
+ }
|
|
}
|
|
}
|