2012-07-04 611 views
5

Tengo problemas para encontrar cómo asociar un usuario #Ldap a un grupo determinado.Asociar usuario de Ldap a un grupo con Java

Eso es lo que he intentado:

Attributes attrs = new BasicAttributes(); 

    BasicAttribute basicAttrs = new BasicAttribute("objectclass"); 
    basicAttrs.add("top"); 
    basicAttrs.add("person"); 

    BasicAttribute memberOf = new BasicAttribute("memberOf"); 
    memberOf.add("Managers"); // Tried with distinguished name too 
    memberOf.add("Administrators"); // Tried with distinguished name too 

    attrs.put(basicAttrs); 
    attrs.put("cn", user.getLogin()); 
    attrs.put("name", user.getLogin()); 
    attrs.put("login", user.getLogin()); 
    attrs.put("mail", user.getMail()); 
    attrs.put("displayName", user.getDisplayName()); 
    attrs.put("memberOf", memberOf); 

    try { 
     ctx.bind("CN=" + user.getLogin() + "," + baseDn, null, attrs); 
    } catch (NamingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

También probé a usar los nombres distinguidos como: "CN = Administradores, OU = < system_name>, OU = Usuarios, OU = < servidor>, DC = com ", pero no funcionó. Creo que debería ser un lugar para hacer referencia al grupo Ldap.

Pero tengo este error:

javax.naming.directory.InvalidAttributeValueException: Malformed 'memberOf' attribute value; remaining name 'CN=lcarvalho,OU=<system_name>,OU=Users,OU=<server>,DC=com' 
at com.sun.jndi.ldap.LdapClient.encodeAttribute(LdapClient.java:951) 
at com.sun.jndi.ldap.LdapClient.add(LdapClient.java:999) 
at com.sun.jndi.ldap.LdapCtx.c_bind(LdapCtx.java:396) 
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_bind(ComponentDirContext.java:277) 
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.bind(PartialCompositeDirContext.java:197) 
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.bind(PartialCompositeDirContext.java:186) 
at javax.naming.directory.InitialDirContext.bind(InitialDirContext.java:158) 
... 

Ésta es toda la traza de la pila además de mis líneas de aplicación.

+0

No he usado JNDI para trabajar con LDAP, pero ¿ha comprobado en su servidor LDAP, si la clase de objeto 'persona' tiene el atributo 'memberOf'? ¿En qué está desarrollando el servidor LDAP? En cualquier caso, debe especificar el DN completo para el 'memberOf'. – hovanessyan

+0

Intenté lo mismo en este momento solo por el hecho de probar esto y puedo reproducir el problema. El atributo 'memberOf' existe y el DN es correcto. Pero creo que el principal problema aquí es que agregar un usuario a un grupo debería pasar del objeto de grupo, no del objeto de usuario (como @EJP se comentó más adelante). –

Respuesta

0

Lo más probable es que su DN está mal, porque parece que ha especificado una unidad organizativa extra en vez del componente de dominio:

"CN=Managers,OU=<system_name>,OU=Users,OU=<server>,DC=com" 

debería ser:

"cn=Managers,ou=<system_name>,ou=Users,dc=<server>,dc=com" 

En LDAP comienza la estructura de directorios con 2 componentes de dominio, que son un nombre de dominio inverso de la compañía (por convención).

Para que el código funcione, hay que tener en cuenta lo siguiente:

  • hay una "Persona" esquema que se carga en el servidor LDAP

  • hay una MemberOf atributo" "definido en su "" esquema

  • "Persona MemberOf" requiere DN completo como la entrada

También lo animo a que eche un vistazo al UnboundID LDAP SDK.

Espero que ayude.

0

El valor del atributo memberOf es incorrecto. El atributo memberOf es probablemente un nombre completo. Los clientes LDAP deben consultar el esquema (cuyo DN base podría estar disponible en el root DSE) cuando tengan dudas sobre la sintaxis, el orden o las reglas de coincidencia de un atributo.

+0

Gracias pero también traté de usar nombres completos, omití el baseDn, pero aquí está: 'String baseDn =" OU = Delphos, OU = Usuarios, OU = Nextel, DC = tablas, DC = com, DC = br "'; Y aquí están los dos nombres distinguidos que estoy usando: 'memberOf.add (" CN = Gestores, OU = Delphos, OU = Roles, OU = Nextel, DC = tablas, DC = com, DC = br "); memberOf.add ("CN = Administradores, OU = Delphos, OU = Roles, OU = Nextel, DC = tablas, DC = com, DC = br"); ' Tengo los esquemas Roles y usuarios creados en el servidor Ldap . También tengo el atributo "memberOf" creado, cuando intento omitirlo, el error cambia a 'Error en la operación de conversión de atributos, datos 0, v1db1' –

3

Si está utilizando OpenLDAP, el atributo memberOf es mantenido automáticamente por el memberOf overlay, y su aplicación no debe escribirlo en absoluto. Lo que debe hacer es agregar el DN del usuario al atributo uniqueMember o roleOccupant, etc. del grupo al que se está uniendo. Entonces su DN aparecerá mágicamente en su atributo memberOf.

+1

. Esta respuesta es correcta y debe marcarse como esa. También lo confirma la respuesta a esta misma pregunta: http://stackoverflow.com/questions/21147625/java-ldap-add-group-to-user-issue-error-code-53-will-not-perform –

-1

Tuve el mismo problema. Compruebe el tipo de valor de este atributo utilizando cualquier cliente de ldap (por ejemplo: Apache Directory Studio). Si intenta reemplazar el atributo cuyo tipo es Cadena con valor int, arrojará este error.

Cuestiones relacionadas