SEC-450: Added group subtree to LDAP test server and extra tests for DefaultLdapAuthoritiesPopulator to make sure searchSubtree parameter works as expected.
This commit is contained in:
@@ -23,8 +23,6 @@ import java.util.Hashtable;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @author Luke Taylor
|
||||
* @version $Id$
|
||||
*/
|
||||
@@ -36,7 +34,7 @@ public abstract class AbstractLdapServerTestCase extends TestCase {
|
||||
protected static final String MANAGER_PASSWORD = "acegisecurity";
|
||||
|
||||
// External server config
|
||||
// private static final String PROVIDER_URL = "ldap://monkeymachine:389/"+ROOT_DN;
|
||||
// private static final String PROVIDER_URL = "ldap://gorille:389/"+ROOT_DN;
|
||||
// private static final String CONTEXT_FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";
|
||||
// private static final Hashtable EXTRA_ENV = new Hashtable();
|
||||
|
||||
@@ -52,7 +50,8 @@ public abstract class AbstractLdapServerTestCase extends TestCase {
|
||||
|
||||
//~ Constructors ===================================================================================================
|
||||
|
||||
protected AbstractLdapServerTestCase() {}
|
||||
protected AbstractLdapServerTestCase() {
|
||||
}
|
||||
|
||||
protected AbstractLdapServerTestCase(String string) {
|
||||
super(string);
|
||||
@@ -64,7 +63,8 @@ public abstract class AbstractLdapServerTestCase extends TestCase {
|
||||
return idf;
|
||||
}
|
||||
|
||||
protected void onSetUp() {}
|
||||
protected void onSetUp() {
|
||||
}
|
||||
|
||||
public final void setUp() {
|
||||
idf = new DefaultInitialDirContextFactory(PROVIDER_URL);
|
||||
|
||||
@@ -22,8 +22,6 @@ import javax.naming.directory.DirContext;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @author Luke Taylor
|
||||
* @version $Id$
|
||||
*/
|
||||
@@ -67,22 +65,24 @@ public class LdapTemplateTests extends AbstractLdapServerTestCase {
|
||||
public void testNamingExceptionIsTranslatedCorrectly() {
|
||||
try {
|
||||
template.execute(new LdapCallback() {
|
||||
public Object doInDirContext(DirContext dirContext)
|
||||
public Object doInDirContext(DirContext dirContext)
|
||||
throws NamingException {
|
||||
throw new NamingException();
|
||||
}
|
||||
});
|
||||
throw new NamingException();
|
||||
}
|
||||
});
|
||||
fail("Expected LdapDataAccessException on NamingException");
|
||||
} catch (LdapDataAccessException expected) {}
|
||||
} catch (LdapDataAccessException expected) {
|
||||
}
|
||||
}
|
||||
|
||||
public void testSearchForSingleAttributeValues() {
|
||||
String param = "uid=ben,ou=people,dc=acegisecurity,dc=org";
|
||||
|
||||
Set values = template.searchForSingleAttributeValues("ou=groups", "(member={0})", new String[] {param}, "ou");
|
||||
Set values = template.searchForSingleAttributeValues("ou=groups", "(member={0})", new String[]{param}, "ou");
|
||||
|
||||
assertEquals("Expected 2 results from search", 2, values.size());
|
||||
assertEquals("Expected 3 results from search", 3, values.size());
|
||||
assertTrue(values.contains("developer"));
|
||||
assertTrue(values.contains("manager"));
|
||||
assertTrue(values.contains("submanager"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ public class LdapTestServer {
|
||||
|
||||
//~ Methods ========================================================================================================
|
||||
|
||||
public void createGroup(String cn, String ou, String[] memberDns) {
|
||||
public void createGroup(String cn, String groupContext, String ou, String[] memberDns) {
|
||||
Attributes group = new BasicAttributes("cn", cn);
|
||||
Attribute members = new BasicAttribute("member");
|
||||
Attribute orgUnit = new BasicAttribute("ou", ou);
|
||||
@@ -82,7 +82,8 @@ public class LdapTestServer {
|
||||
group.put(orgUnit);
|
||||
|
||||
try {
|
||||
serverContext.createSubcontext("cn=" + cn + ",ou=groups", group);
|
||||
DirContext ctx = serverContext.createSubcontext("cn=" + cn + "," + groupContext, group);
|
||||
System.out.println("Created group " + ctx.getNameInNamespace());
|
||||
} catch (NameAlreadyBoundException ignore) {
|
||||
// System.out.println(" group " + cn + " already exists.");
|
||||
} catch (NamingException ne) {
|
||||
@@ -122,7 +123,7 @@ public class LdapTestServer {
|
||||
ou.put(objectClass);
|
||||
|
||||
try {
|
||||
serverContext.createSubcontext("ou=" + name, ou);
|
||||
serverContext.createSubcontext(name, ou);
|
||||
} catch (NameAlreadyBoundException ignore) {
|
||||
// System.out.println(" ou " + name + " already exists.");
|
||||
} catch (NamingException ne) {
|
||||
@@ -188,16 +189,19 @@ public class LdapTestServer {
|
||||
}
|
||||
|
||||
private void initTestData() {
|
||||
createOu("people");
|
||||
createOu("groups");
|
||||
createOu("ou=people");
|
||||
createOu("ou=groups");
|
||||
createOu("ou=subgroups,ou=groups");
|
||||
|
||||
createUser("bob", "Bob Hamilton", "bobspassword");
|
||||
createUser("ben", "Ben Alex", "{SHA}nFCebWjxfaLbHHG1Qk5UU4trbvQ=");
|
||||
|
||||
String[] developers = new String[] {
|
||||
String[] developers = new String[]{
|
||||
"uid=ben,ou=people,dc=acegisecurity,dc=org", "uid=bob,ou=people,dc=acegisecurity,dc=org"
|
||||
};
|
||||
createGroup("developers", "developer", developers);
|
||||
createGroup("managers", "manager", new String[] {developers[0]});
|
||||
};
|
||||
createGroup("developers", "ou=groups", "developer", developers);
|
||||
createGroup("managers", "ou=groups", "manager", new String[]{developers[0]});
|
||||
createGroup("submanagers", "ou=subgroups,ou=groups", "submanager", new String[]{developers[0]});
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
@@ -243,11 +247,13 @@ public class LdapTestServer {
|
||||
}
|
||||
}
|
||||
|
||||
/** Recursively deletes a directory */
|
||||
/**
|
||||
* Recursively deletes a directory
|
||||
*/
|
||||
private boolean deleteDir(File dir) {
|
||||
if (dir.isDirectory()) {
|
||||
String[] children = dir.list();
|
||||
for (int i=0; i<children.length; i++) {
|
||||
for (int i = 0; i < children.length; i++) {
|
||||
boolean success = deleteDir(new File(dir, children[i]));
|
||||
if (!success) {
|
||||
return false;
|
||||
|
||||
@@ -23,13 +23,14 @@ import org.acegisecurity.userdetails.ldap.LdapUserDetailsImpl;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
|
||||
import javax.naming.directory.BasicAttributes;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
DOCUMENT ME!
|
||||
* DOCUMENT ME!
|
||||
*
|
||||
* @author Luke Taylor
|
||||
* @version $Id$
|
||||
@@ -63,7 +64,8 @@ public class DefaultLdapAuthoritiesPopulatorTests extends AbstractLdapServerTest
|
||||
// GrantedAuthority[] authorities =
|
||||
// populator.getGrantedAuthorities(user.createUserDetails());
|
||||
// assertEquals("User should have three roles", 3, authorities.length);
|
||||
// }
|
||||
|
||||
// }
|
||||
public void testDefaultRoleIsAssignedWhenSet() {
|
||||
DefaultLdapAuthoritiesPopulator populator = new DefaultLdapAuthoritiesPopulator(getInitialCtxFactory(),
|
||||
"ou=groups");
|
||||
@@ -118,6 +120,48 @@ public class DefaultLdapAuthoritiesPopulatorTests extends AbstractLdapServerTest
|
||||
|
||||
GrantedAuthority[] authorities = populator.getGrantedAuthorities(user.createUserDetails());
|
||||
assertEquals("Should have 1 role", 1, authorities.length);
|
||||
assertTrue(authorities[0].equals("ROLE_MANAGER"));
|
||||
assertEquals("ROLE_MANAGER", authorities[0].getAuthority());
|
||||
}
|
||||
|
||||
public void testSubGroupRolesAreNotFoundByDefault() {
|
||||
DefaultLdapAuthoritiesPopulator populator = new DefaultLdapAuthoritiesPopulator(getInitialCtxFactory(),
|
||||
"ou=groups");
|
||||
populator.setGroupRoleAttribute("ou");
|
||||
populator.setConvertToUpperCase(true);
|
||||
|
||||
LdapUserDetailsImpl.Essence user = new LdapUserDetailsImpl.Essence();
|
||||
user.setUsername("manager");
|
||||
user.setDn("uid=ben,ou=people,dc=acegisecurity,dc=org");
|
||||
|
||||
GrantedAuthority[] authorities = populator.getGrantedAuthorities(user.createUserDetails());
|
||||
assertEquals("Should have 2 roles", 2, authorities.length);
|
||||
Set roles = new HashSet(2);
|
||||
roles.add(authorities[0].getAuthority());
|
||||
roles.add(authorities[1].getAuthority());
|
||||
assertTrue(roles.contains("ROLE_MANAGER"));
|
||||
assertTrue(roles.contains("ROLE_DEVELOPER"));
|
||||
}
|
||||
|
||||
public void testSubGroupRolesAreFoundWhenSubtreeSearchIsEnabled() {
|
||||
DefaultLdapAuthoritiesPopulator populator = new DefaultLdapAuthoritiesPopulator(getInitialCtxFactory(),
|
||||
"ou=groups");
|
||||
populator.setGroupRoleAttribute("ou");
|
||||
populator.setConvertToUpperCase(true);
|
||||
populator.setSearchSubtree(true);
|
||||
|
||||
LdapUserDetailsImpl.Essence user = new LdapUserDetailsImpl.Essence();
|
||||
user.setUsername("manager");
|
||||
user.setDn("uid=ben,ou=people,dc=acegisecurity,dc=org");
|
||||
|
||||
GrantedAuthority[] authorities = populator.getGrantedAuthorities(user.createUserDetails());
|
||||
assertEquals("Should have 3 roles", 3, authorities.length);
|
||||
Set roles = new HashSet(3);
|
||||
roles.add(authorities[0].getAuthority());
|
||||
roles.add(authorities[1].getAuthority());
|
||||
roles.add(authorities[2].getAuthority());
|
||||
assertTrue(roles.contains("ROLE_MANAGER"));
|
||||
assertTrue(roles.contains("ROLE_DEVELOPER"));
|
||||
assertTrue(roles.contains("ROLE_SUBMANAGER"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user