Создание пользовательской схемы / добавление к существующей схеме для сервера UnboundID LDAP в памяти - PullRequest
6 голосов
/ 21 октября 2011

Я пытаюсь продублировать макет / схему LDAP из поля, с которым сталкивается мое приложение, и пытаюсь воссоздать + протестировать его с помощью автоматического теста с помощью встраиваемого сервера UnboundID LDAP.

Ситуация, с которой приходится иметь дело, это свойство memberOf пользовательской схемы, как в Active Directory ... но я не совсем уверен, как добавить класс user в этот ldap в памяти.

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));
    }

Ответы [ 3 ]

6 голосов
/ 24 апреля 2013

Любому, кто сталкивается с этим, может быть интересно знать, что функциональность, называемая Нилом Уилсоном, была реализована (по крайней мере, в com.unboundid: unboundid-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', и вы должны указать полное определение, чтобы ссылаться на него.Определение находится в схеме по умолчанию, как упомянуто Нейлом: docs / standard-schema.ldif

Я скопировал определение атрибута userPrincipalName из некоторых документов Oracle, которые описывают, как изменить элементы схемы: http://docs.oracle.com/cd/E12839_01/oid.1111/e10035/ldif_appendix.htm#CHDCCJIG

4 голосов
/ 21 октября 2011

В настоящее время сервер каталогов в памяти не поддерживает интерактивные изменения схемы (т. Е. Обновление записи схемы cn = с помощью операций изменения LDAP).Это в моем списке дел, но оно еще не реализовано.

Однако, если вы просто хотите настроить схему, с которой работает сервер, вы можете просто инициализировать сервер той схемой, которую хотите использовать.,Вы можете создать схему из информации в нескольких файлах (а та, которая используется сервером в памяти по умолчанию, включена в файл docs / standard-schema.ldif, так что вы можете просто добавить второй файл с нужными элементами схемы, которые вам нужныиспользовать).

Нил

0 голосов
/ 21 октября 2011

С точки зрения чистого LDAP, поведение, которое вы хотите использовать, называется Ссылочная целостность , и, как я могу прочитать в LDAP SDK для Java

  • Это обеспечиваетвозможность поддерживать ссылочную целостность для указанного набора атрибутов для операций удаления и изменения DN ...

Я не могу вам в этом помочь.

Насколько активно-Каталог - это цель, одна хорошая вещь для тестирования - это установить ADAM (режим приложения Active Dirctory).Это бесплатный каталог от Microsoft, который вы можете использовать для дублирования в схеме и объектах AD. ADAM - это распространяемый , который можно установить даже в Windows XP.Для установки на Windows Seven лучше использовать LDS ( Служба облегченных каталогов ).Оба используют инструменты для миграции схемы AD и объектов из AD.

...