package org.apereo.cas.authentication.principal;
import org.apereo.cas.adaptors.ldap.AbstractLdapTests;
import org.apereo.cas.authentication.CoreAuthenticationTestUtils;
import org.apereo.cas.authentication.UsernamePasswordCredential;
import org.apereo.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler;
import org.apereo.cas.authentication.principal.resolvers.ChainingPrincipalResolver;
import org.apereo.cas.authentication.principal.resolvers.EchoingPrincipalResolver;
import org.apereo.cas.authentication.principal.resolvers.PersonDirectoryPrincipalResolver;
import org.apereo.cas.config.CasPersonDirectoryConfiguration;
import org.apereo.services.persondir.IPersonAttributeDao;
import org.junit.BeforeClass;
import org.junit.Test;
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 java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.*;
/**
* This is {@link PersonDirectoryPrincipalResolverLdaptiveTests}.
*
* @author Misagh Moayyed
* @since 5.0.0
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {CasPersonDirectoryConfiguration.class, RefreshAutoConfiguration.class})
@TestPropertySource(locations={"classpath:/ldap.properties"})
public class PersonDirectoryPrincipalResolverLdaptiveTests extends AbstractLdapTests {
private static final Logger LOGGER = LoggerFactory.getLogger(PersonDirectoryPrincipalResolverLdaptiveTests.class);
private static final String ATTR_NAME_PASSWORD = "userPassword";
@Autowired
@Qualifier("attributeRepository")
private IPersonAttributeDao attributeRepository;
@BeforeClass
public static void bootstrap() throws Exception {
LOGGER.debug("Running [{}]", PersonDirectoryPrincipalResolverLdaptiveTests.class.getSimpleName());
initDirectoryServer();
}
@Test
public void verifyResolver() {
this.getEntries().forEach(entry -> {
final String username = entry.getAttribute("sAMAccountName").getStringValue();
final String psw = entry.getAttribute(ATTR_NAME_PASSWORD).getStringValue();
final PersonDirectoryPrincipalResolver resolver = new PersonDirectoryPrincipalResolver();
resolver.setAttributeRepository(this.attributeRepository);
final Principal p = resolver.resolve(new UsernamePasswordCredential(username, psw),
CoreAuthenticationTestUtils.getPrincipal(),
new SimpleTestUsernamePasswordAuthenticationHandler());
assertNotNull(p);
assertTrue(p.getAttributes().containsKey("displayName"));
});
}
@Test
public void verifyChainedResolver() {
this.getEntries().forEach(entry -> {
final String username = entry.getAttribute("sAMAccountName").getStringValue();
final String psw = entry.getAttribute(ATTR_NAME_PASSWORD).getStringValue();
final PersonDirectoryPrincipalResolver resolver = new PersonDirectoryPrincipalResolver();
resolver.setAttributeRepository(this.attributeRepository);
final ChainingPrincipalResolver chain = new ChainingPrincipalResolver();
chain.setChain(Arrays.asList(resolver, new EchoingPrincipalResolver()));
final Map<String, Object> attributes = new HashMap<>(2);
attributes.put("a1", "v1");
attributes.put("a2", "v2");
final Principal p = chain.resolve(new UsernamePasswordCredential(username, psw),
CoreAuthenticationTestUtils.getPrincipal(username, attributes),
new SimpleTestUsernamePasswordAuthenticationHandler());
assertNotNull(p);
assertTrue(p.getAttributes().containsKey("displayName"));
assertTrue(p.getAttributes().containsKey("a1"));
assertTrue(p.getAttributes().containsKey("a2"));
});
}
}