2011-10-20 4 views
5

Próbuję skopiować układ/schemat LDAP z pola, z którym ma do czynienia moja aplikacja - i próbuję odtworzyć + przetestuj go za pomocą automatycznego testu z wbudowanym serwerem LDAP UnboundID.Tworzenie niestandardowego schematu/dodawanie do istniejącego schematu dla serwera LDAP w ramach operacji UnboundID

Sytuacja, z którą musi sobie poradzić, to właściwość "memberOf" użytkownika, taka jak Active Directory ... ale nie jestem do końca pewien, jak dodać klasę "użytkownika" do tego ldap w pamięci.

1) Czy to możliwe? 2) Czy istnieje lepsza strategia? 3) A co konkretnie powinienem zrobić? Jestem nowicjuszem LDAP.

Poniżej znajduje się mój kod niepracujący.

Dzięki, Mike Kohout

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

Odpowiedz

5

Każdy, kto jest po drugiej stronie może być zainteresowany, aby wiedzieć, że funkcjonalność, o której mowa będzie Neil Wilson został wdrożony (przynajmniej w com.unboundid: unboundid-ldapsdk: 2.3.1) :)

Oto jak można zastąpić osobę objectClass z jednym, który zawiera atrybut 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)) 

nocie, że osoba objectClass muszą być usunięte. Jest zdefiniowany jako atrybut "objectClasses" i należy podać całą definicję, aby się do niego odwoływać. Definicja znajduje się w domyślnym schemacie, jak wspomina Neil: docs/standard-schema.ldif

skopiowane userPrincipalName definicję atrybutu z niektórych docs Oracle, które opisują, jak zmodyfikować elementy schematu: http://docs.oracle.com/cd/E12839_01/oid.1111/e10035/ldif_appendix.htm#CHDCCJIG

+2

Otrzymuję 'Nie można dodać pozycji z DN, który jest taki sam lub podrzędny do podcięcia DN cewka = subshema DN 'cn = schema'' błąd, gdy próbuję to, sdk v.2.3.4 – SelimOber

0

na czystym uwagę LDAP zachowanie chcesz użyć nazywa Referencial Integrity i jak mogę przeczytać w LDAP SDK for Java

  • Zapewnia opcję zachowaj integralność referencyjną dla określonego zestawu atrybutów dla usunięcia i modyfikacji operacji DN ...

Nie mogę ci w ten sposób pomóc.

O ile Active-Directory jest celem, dobrą rzeczą do testowania jest zainstalowanie ADAM (Active Dirctory Application Mode). Jest to bezpłatny katalog firmy Microsoft, którego można użyć do duplikowania w schemacie i obiektach usług AD. ADAM is a redistribuable, którą można nawet zainstalować w systemie Windows XP. Aby zainstalować na Windows Seven, lepiej użyj LDS (Lightweight directory service). Oba używa narzędzi do migrowania schematu AD i obiektów z AD.

+0

Funny należy wspomnieć, że w rzeczywistości jest ADAM-konfiguracja klienta. Moja wielka nadzieja polegała na tym, że mogłem używać UnboundID w testach jednostkowych, dzięki czemu wyglądało to tak, jak ADAM, więc byłoby użyteczne dla testu unit/integration. –

4

Obecnie serwer katalogów w pamięci nie obsługuje zmian schematu online (tj. Aktualizowania wpisu cn = schema poprzez operacje modyfikacji protokołu LDAP). To jest na mojej liście rzeczy do zrobienia, ale nie została jeszcze wdrożona.

Jeśli jednak chcesz dostosować schemat, z którego korzysta serwer, możesz po prostu zainicjować serwer za pomocą schematu, którego chcesz użyć. Schemat można utworzyć na podstawie informacji w wielu plikach (ten, który domyślnie jest wykorzystywany w pamięci w pamięci zawartej w pliku docs/standard-schema.ldif, można po prostu dodać drugi plik z niestandardowymi elementami schematu, które chcesz używać).

Neil

+0

Dzięki za informację, Neil. Jak wysoko na liście rzeczy do zrobienia jest ta odrobina funkcjonalności, och życzliwa? Co więcej, czy zamierzasz zainicjować go za pomocą wywołania server.initializeFromLDIF (true, "/tmp/test.ldif")? –

+0

Prawdopodobnie nie ma większego wysiłku, aby dodać tę obsługę, z kilkoma ustępstwami (np. Jeśli zmienisz reguły składni/dopasowania dla zdefiniowanego typu atrybutu, istniejące wpisy z tym atrybutem będą nadal używać starego zachowania i niekompatybilnych zmian w obiekcie definicje klas mogą powodować, że niektóre wpisy nie będą już zgodne ze schematem). –

+1

Ponadto, aby skonfigurować niestandardowy schemat, należy użyć metody InMemoryDirectoryServerConfig.setSchema przed uruchomieniem serwera. Istnieje kilka metod Schema.getSchema, które pobierają zestaw plików, które zbiorczo zostaną użyte do utworzenia schematu. –