2011-10-20 2 views
5

Sto provando a duplicare un layout/schema LDAP dal campo che l'applicazione deve affrontare e sto tentando di ricreare + testarlo tramite un test automatico con il server LDAP UnboundID integrabile.Creazione di uno schema personalizzato/aggiunta allo schema esistente per un server LDAP UnboundID in memoria

La situazione che deve affrontare è la proprietà 'memberOf' dello schema utente come Active Directory ha ... ma non sono abbastanza sicuro di come aggiungere una classe 'utente' a questo ldap in memoria.

1) È possibile? 2) Esiste una strategia migliore? 3) E in particolare cosa dovrei fare? Sono un principiante LDAP.

Di seguito è riportato il mio codice non lavorativo.

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

risposta

5

Chi si imbatte in questo può essere interessati a sapere che la funzionalità di cui essere Neil Wilson è stato implementato (almeno in com.unboundid: unboundid-ldapsdk: 2.3.1) :)

Ecco come si potrebbe sostituire la persona objectClass con una che contiene un attributo 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)) 

nota che la persona objectClass deve essere rimosso. È definito come un attributo 'objectClasses' ed è necessario specificare l'intera definizione per farvi riferimento. La definizione è nello schema predefinito come menzionato da Neil: docs/standard-schema.ldif

ho copiato l'userPrincipalName attributo definizione da alcuni documenti di Oracle che descrivono come modificare gli elementi dello schema: http://docs.oracle.com/cd/E12839_01/oid.1111/e10035/ldif_appendix.htm#CHDCCJIG

+2

Mi viene restituito un 'Impossibile aggiungere una voce con un DN uguale o subordinato alla sottoschema subentry DN 'cn = schema'' error quando provo questo, sdk v.2.3.4 – SelimOber

0

sulla pura considerazione LDAP il comportamento che si desidera utilizzare è chiamato referenziale Integrità e come posso leggere in LDAP SDK for Java

  • Esso prevede la possibilità di mantenere l'integrità referenziale per un insieme specifico di attributi per eliminare e modificare le operazioni DN ...

Non posso aiutarti molto in questo modo.

Finora Active Directory è un obiettivo, una cosa buona per i test è l'installazione di un ADAM (Active Application Mode Mode). È una directory gratuita di Microsoft che è possibile utilizzare per duplicare in schemi e oggetti di Active Directory. ADAM is a redistribuable che puoi installare anche su Windows XP. Per installare su Windows Seven è meglio usare LDS (Lightweight directory service). Entrambi utilizzano gli strumenti per migrare uno schema AD e oggetti da AD.

+0

divertente si dovrebbe ricordare che-ADAM è in realtà l'installazione del cliente. La mia grande speranza era che potessi usare UnboundID all'interno dei test unitari, rendendolo abbastanza simile ad ADAM, quindi sarebbe utile per il test di unità/integrazione. –

4

Allo stato attuale, il server di directory in memoria non supporta le modifiche dello schema in linea (ad esempio, l'aggiornamento della voce cn = schema tramite le operazioni di modifica LDAP). Questo è nella mia lista delle cose da fare, ma non è ancora stato implementato.

Tuttavia, se si desidera semplicemente personalizzare lo schema con cui viene eseguito il server, è possibile semplicemente inizializzare il server con lo schema che si desidera utilizzare. È possibile creare uno schema da informazioni in più file (e quello che il server in memoria utilizza per impostazione predefinita è incluso nel file docs/standard-schema.ldif, quindi è sufficiente aggiungere un secondo file con gli elementi dello schema personalizzati che si desidera usare).

Neil

+0

Grazie per l'informazione, Neil. Quanto in alto nella lista delle cose da fare è questo bit di funzionalità, oh benevolo? Inoltre, intendi specificamente inizializzarlo tramite una chiamata a server.initializeFromLDIF (true, "/tmp/test.ldif")? –

+0

Probabilmente non è un enorme sforzo aggiungere questo supporto, con alcune concessioni (ad esempio, se si modificano le regole di sintassi/matching per un tipo di attributo definito, le voci esistenti con quell'attributo useranno ancora il vecchio comportamento e le modifiche incompatibili all'oggetto le definizioni di classe possono risultare in alcune voci che non sono più conformi allo schema). –

+1

Inoltre, per configurare uno schema personalizzato, utilizzare il metodo InMemoryDirectoryServerConfig.setSchema prima di avviare il server. Esistono un paio di metodi Schema.getSchema che accettano un insieme di file che verranno utilizzati collettivamente per creare uno schema. –