package org.apereo.cas.authentication; import org.apereo.cas.adaptors.ldap.AbstractLdapTests; import org.apereo.cas.config.CasCoreAuthenticationConfiguration; import org.apereo.cas.config.CasCoreAuthenticationHandlersConfiguration; import org.apereo.cas.config.CasCoreAuthenticationMetadataConfiguration; import org.apereo.cas.config.CasCoreAuthenticationPolicyConfiguration; import org.apereo.cas.config.CasCoreAuthenticationPrincipalConfiguration; import org.apereo.cas.config.CasCoreAuthenticationSupportConfiguration; import org.apereo.cas.config.CasCoreHttpConfiguration; import org.apereo.cas.config.CasCoreServicesConfiguration; import org.apereo.cas.config.CasPersonDirectoryConfiguration; import org.apereo.cas.config.LdapAuthenticationConfiguration; import org.apereo.cas.config.support.CasWebApplicationServiceFactoryConfiguration; import org.jooq.lambda.Unchecked; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.autoconfigure.RefreshAutoConfiguration; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import javax.security.auth.login.AccountNotFoundException; import javax.security.auth.login.FailedLoginException; import java.util.Collection; import static org.junit.Assert.*; /** * Unit test for {@link LdapAuthenticationHandler}. * * @author Marvin S. Addison * @author Misagh Moayyed * @since 4.0.0 */ @RunWith(SpringRunner.class) @SpringBootTest(classes = {RefreshAutoConfiguration.class, CasCoreAuthenticationPrincipalConfiguration.class, CasCoreAuthenticationPolicyConfiguration.class, CasCoreAuthenticationMetadataConfiguration.class, CasCoreAuthenticationSupportConfiguration.class, CasCoreAuthenticationHandlersConfiguration.class, CasWebApplicationServiceFactoryConfiguration.class, CasCoreHttpConfiguration.class, CasPersonDirectoryConfiguration.class, CasCoreAuthenticationConfiguration.class, CasCoreServicesConfiguration.class, LdapAuthenticationConfiguration.class}) @TestPropertySource(locations = {"classpath:/ldap.properties"}) public class LdapAuthenticationHandlerTests extends AbstractLdapTests { private static final Logger LOGGER = LoggerFactory.getLogger(LdapAuthenticationHandlerTests.class); @Rule public ExpectedException thrown = ExpectedException.none(); @Autowired @Qualifier("ldapAuthenticationHandlers") private Collection<AuthenticationHandler> handler; @BeforeClass public static void bootstrap() throws Exception { LOGGER.debug("Running [{}]", LdapAuthenticationHandlerTests.class.getSimpleName()); initDirectoryServer(); } @AfterClass public static void shutdown() throws Exception { DIRECTORY.close(); } @Test public void verifyAuthenticateSuccess() throws Exception { assertNotEquals(handler.size(), 0); getEntries().forEach(entry -> { final String username = entry.getAttribute("sAMAccountName").getStringValue(); final String psw = entry.getAttribute("userPassword").getStringValue(); this.handler.forEach(Unchecked.consumer(h -> { final HandlerResult result = h.authenticate(new UsernamePasswordCredential(username, psw)); assertNotNull(result.getPrincipal()); assertEquals(username, result.getPrincipal().getId()); assertEquals( entry.getAttribute("displayName").getStringValue(), result.getPrincipal().getAttributes().get("displayName")); assertEquals( entry.getAttribute("mail").getStringValue(), result.getPrincipal().getAttributes().get("mail")); })); }); } @Test public void verifyAuthenticateFailure() throws Throwable { assertNotEquals(handler.size(), 0); this.thrown.expect(FailedLoginException.class); try { this.getEntries().stream() .map(entry -> entry.getAttribute("sAMAccountName").getStringValue()) .forEach(username -> this.handler.forEach(Unchecked.consumer(h -> { h.authenticate(new UsernamePasswordCredential(username, "badpassword")); }))); } catch (final Exception e) { throw e.getCause(); } } @Test public void verifyAuthenticateNotFound() throws Throwable { try { this.thrown.expect(AccountNotFoundException.class); this.handler.forEach(Unchecked.consumer(h -> { h.authenticate(new UsernamePasswordCredential("notfound", "badpassword")); })); } catch (final Exception e) { throw e.getCause(); } } }