2011-10-20 17 views
5

Estoy tratando de duplicar un diseño/esquema LDAP desde el campo que mi aplicación tiene que tratar, y estoy tratando de recrear + pruébelo a través de una prueba automática con el servidor LDAP UnboundID integrable.Crear un esquema personalizado/agregar al esquema existente para un servidor LDAP UnboundID en memoria

La situación que tiene que tratar es la propiedad 'memberOf' del esquema del usuario como Active Directory ... pero no estoy muy seguro de cómo agregar una clase 'user' a este ldap en la memoria.

1) ¿Es esto posible? 2) ¿Hay una mejor estrategia? 3) ¿Y qué debo hacer en particular? Soy un novato de LDAP.

A continuación se muestra mi código que no funciona.

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

Respuesta

5

Cualquiera que viene a través de esto puede estar interesado en saber que la funcionalidad se refiere ser Neil Wilson ha sido implementada (por lo menos en com.unboundid: UnboundID-ldapsdk: 2.3.1) :)

Aquí es cómo puede reemplazar a la persona objectClass con uno que contiene un atributo 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)) 

Tenga en cuenta que la persona objectClass debe ser eliminado. Se define como un atributo 'objectClasses' y debe especificar toda la definición para hacer referencia a él. La definición está en el esquema predeterminado como lo menciona Neil: docs/standard-schema.ldif

que copió el userPrincipalName definición de atributo de algunos documentos de Oracle que describen cómo modificar los elementos del esquema: http://docs.oracle.com/cd/E12839_01/oid.1111/e10035/ldif_appendix.htm#CHDCCJIG

+2

Obtengo un 'No se puede agregar una entrada con un DN que sea igual o subordinado al subentry del subesquema DN 'cn = schema'' error cuando intento esto, sdk v.2.3.4 – SelimOber

0

En consideración LDAP puro el comportamiento que desea utilizar se llama Referencial Integridad y que puedo leer en LDAP SDK for Java

  • Proporciona una opción para mantener la integridad referencial para un conjunto específico de atributos para eliminar y modificar operaciones DN ...

No puedo ayudarte mucho de esta manera.

Como Active Directory es un objetivo, una cosa buena para las pruebas es instalar un ADAM (modo de aplicación de directorio activo). Es un Directorio de Microsoft gratuito que puede usar para duplicar en objetos y esquema AD. ADAM is a redistribuable que incluso puede instalar en Windows XP. Para instalar en Windows Seven, es mejor utilizar LDS (Lightweight directory service). Ambos usan herramientas para migrar un esquema AD y objetos desde AD.

+0

curioso que mencionar que es en realidad ADAM-configuración del cliente. Mi gran esperanza era poder usar UnboundID dentro de las pruebas unitarias, lo que lo hacía parecer lo suficientemente parecido a ADAM, por lo que sería útil para la unidad/prueba de integración. –

4

Actualmente, el servidor de directorios en memoria no admite cambios de esquema en línea (es decir, la actualización de la entrada de esquema cn = a través de operaciones de modificación de LDAP). Eso está en mi lista de cosas por hacer, pero aún no está implementado.

Sin embargo, si solo desea personalizar el esquema con el que se ejecuta el servidor, entonces simplemente puede inicializar el servidor con el esquema que desea utilizar. Puede crear un esquema a partir de información en múltiples archivos (y el que el servidor en memoria usa por defecto se incluye en el archivo docs/standard-schema.ldif, de modo que puede agregar un segundo archivo con los elementos de esquema personalizados que desee usar).

Neil

+0

Gracias por la información, Neil. ¿Qué tan alto en la lista de cosas por hacer es este poco de funcionalidad, oh benevolente? Además, ¿desea específicamente inicializarlo mediante una llamada a server.initializeFromLDIF (true, "/tmp/test.ldif")? –

+0

Probablemente no sea un gran esfuerzo agregar este soporte, con algunas concesiones (por ejemplo, si cambia las reglas de sintaxis/coincidencia para un tipo de atributo definido, las entradas existentes con ese atributo seguirán usando el comportamiento anterior y los cambios incompatibles con el objeto las definiciones de clases pueden dar como resultado algunas entradas que ya no cumplen con el esquema). –

+1

Además, para configurar un esquema personalizado, utilice el método InMemoryDirectoryServerConfig.setSchema antes de iniciar el servidor. Hay un par de métodos Schema.getSchema que toman un conjunto de archivos que se usarán colectivamente para crear un esquema. –

Cuestiones relacionadas