Unit testing 为内存中未绑定的LDAP服务器创建自定义架构/添加到现有架构

Unit testing 为内存中未绑定的LDAP服务器创建自定义架构/添加到现有架构,unit-testing,active-directory,ldap,Unit Testing,Active Directory,Ldap,我正在尝试从应用程序必须处理的字段复制LDAP布局/模式,并尝试通过使用可嵌入的未绑定LDAP服务器进行自动测试来重新创建和测试它 它必须处理的情况是用户模式的'memberOf'属性,就像Active Directory一样……但是我不太确定如何在内存中向这个ldap添加'user'类 1) 这可能吗? 2) 有更好的策略吗? 3) 我应该特别做什么?我是LDAP新手 下面是我的非工作代码 谢谢, 迈克·科霍特 public class TestOpenLdap2 { private

我正在尝试从应用程序必须处理的字段复制LDAP布局/模式,并尝试通过使用可嵌入的未绑定LDAP服务器进行自动测试来重新创建和测试它

它必须处理的情况是用户模式的'memberOf'属性,就像Active Directory一样……但是我不太确定如何在内存中向这个ldap添加'user'类

1) 这可能吗? 2) 有更好的策略吗? 3) 我应该特别做什么?我是LDAP新手

下面是我的非工作代码

谢谢, 迈克·科霍特

public class TestOpenLdap2
{
    private InMemoryDirectoryServer server;

    @Before
    public void start() throws Exception
    {
        InMemoryDirectoryServerConfig config = new InMemoryDirectoryServerConfig("dc=com");
        config.addAdditionalBindCredentials("cn=admin,ou=People,dc=example,dc=com", "cred");
        InMemoryListenerConfig listenerConfig = new InMemoryListenerConfig("test", null, 33390, null, null, null);
        config.setListenerConfigs(listenerConfig);
        server = new InMemoryDirectoryServer(config);
        server.startListening();
    }

    @Test
    public void testMemberOf() throws Exception
    {

        addEntry("dn: dc=com", "objectClass: top", "objectClass: domain", "dc: com");

        ObjectClassDefinition oc = new ObjectClassDefinition("10.19.19.78", new String[]{"user"}, "", false, new String[]{"TOP"},
                                                                              ObjectClassType.STRUCTURAL, new String[]{"memberOf"},
                                                                              new String[]{}, new HashMap());
        addEntry("dn: cn=schema2,dc=com", "objectClass: top", "objectClass: ldapSubEntry", "objectClass: subschema", "cn: schema2",
                    "objectClasses:  " + oc.toString());

        addEntry("dn: dc=people,dc=com", "objectClass: top", "objectClass: domain", "dc: people");
        addEntry("dn: dc=groups,dc=com", "objectClass: top", "objectClass: domain", "dc: groups");
        addEntry("dn: cn=test-group,dc=groups,dc=com", "objectClass: groupOfUniqueNames", "cn: test group");
        addEntry("dn: cn=Testy Tester,dc=people,dc=com", "objectClass: Person", "objectClass: user", "objectClass: organizationalPerson", "sn: Tester", "cn: Testy Tester", "memberOf: cn=test-group,dc=groups,dc=com");
    }

    public void addEntry(String... args) throws LDIFException, LDAPException
    {
        LDAPResult result = server.add(args);
        assert (result.getResultCode().intValue() == 0);
        System.out.println("added entry:" + Arrays.asList(args));
    }

从纯LDAP的角度考虑,您想要使用的行为称为引用完整性,正如我在中所读到的

  • 它提供了一个选项,用于为删除和修改DN操作的指定属性集维护引用完整性
这样我帮不了你多少忙


就Active Directory为目标而言,测试的一个好方法是安装ADAM(Active Directory应用程序模式)。这是Microsoft提供的免费目录,可用于在AD模式和对象中复制。您甚至可以在Windows XP上安装。要在WindowsSeven上安装,最好使用LDS()。两者都使用工具从AD迁移AD架构和对象。

目前,内存目录服务器不支持在线架构更改(即,通过LDAP修改操作更新cn=schema条目)。这在我的待办事项清单上,但尚未实施

但是,如果您只想自定义服务器运行时使用的模式,那么只需使用您想要使用的模式初始化服务器即可。您可以根据多个文件中的信息创建架构(内存中服务器默认使用的架构包含在docs/standard-schema.ldif文件中,因此您只需添加第二个文件,其中包含要使用的自定义架构元素)


Neil

任何遇到此问题的人都可能有兴趣知道Neil Wilson所指的功能已经实现(至少在com.unbounded:unbounded ldapsdk:2.3.1中):)

以下是如何将person对象类替换为包含userPrincipalName属性的对象类:

dn: cn=schema
changetype: modify
add: attributetypes
attributetypes: ( 1.2.3.4.5.6.7 NAME 'userPrincipalName' DESC 'userPrincipalName as per Active Directory' EQUALITY caseIgnoreMatch SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )

dn: cn=schema
changetype: modify
delete: objectClasses
objectClasses: ( 2.5.6.6
                 NAME 'person'
                 SUP top
                 STRUCTURAL
                 MUST ( sn $
                        cn )
                 MAY ( userPassword $
                       telephoneNumber $
                       seeAlso $
                       description )
                 X-ORIGIN 'RFC 4519' )

dn: cn=schema
changetype: modify
add: objectClasses
objectClasses: ( 2.5.6.6
                 NAME 'person'
                 SUP top
                 STRUCTURAL
                 MUST ( sn $
                        cn $
                        userPrincipalName )
                 MAY ( userPassword $
                       telephoneNumber $
                       seeAlso $
                       description ) )
请注意,必须删除person对象类。它被定义为“objectClasses”属性,您必须指定引用它的整个定义。定义位于Neil:docs/standard-schema.ldif提到的默认模式中


我从一些描述如何修改模式元素的Oracle文档中复制了userPrincipalName属性定义:

有趣的是,您应该提到ADAM实际上是客户机的设置。我最大的希望是我可以使用未绑定的内部单元测试,让它看起来足够像ADAM,这样它对单元/集成测试有用。谢谢你的信息,Neil。这一点功能在待办事项列表中的位置有多高,哦,仁慈的一项?另外,您是否特别想通过调用server.initializeFromLDIF(true,“/tmp/test.ldif”)对其进行初始化?添加此支持可能不费吹灰之力,但有一些让步(例如,如果更改已定义属性类型的语法/匹配规则,则具有该属性的现有条目仍将使用旧行为,并且对对象类定义的不兼容更改可能导致某些条目不再符合架构)。此外,若要配置自定义架构,请在启动服务器之前使用InMemoryDirectoryServerConfig.setSchema方法。有两个schema.getSchema方法可以获取一组文件,这些文件将共同用于创建架构。是的,我只是在测试之前加载架构。有关我使用的注释和示例测试,请参阅。我正在获取g当我尝试此操作时,
无法添加与子模式子项DN'cn=schema'相同或从属于该子模式的DN的条目。
错误,sdk v.2.3.4