Barras diagonales en los nombres devueltos por la consulta JNDI al servidor LDAP

Necesito hacer varias consultas al servidor de directorio LDAP y estoy usando las instalaciones del directorio JNDI para ello. Luego necesito trabajar un poco con los objetos del resultado de la consulta usando sus nombres completos. Algunas de las entradas devueltas por el servidor contienen el carácter de barra inclinada y, debido a esto, JNDI escapa del nombre completo con comillas dobles:

NamingEnumeration<SearchResult> results = dirContext.search(queryRoot, queryFilter, controls);
for (SearchResult result : Collections.list(results)) {
    String objectName = result.getName();
    System.out.println(objectName);
}

Si uno de los objetos en los resultados de la consulta tiene un nombre, digamos, 'b=id/10,a=1', se imprime así

"b=id/10,a=1"

Tenga en cuenta las comillas dobles alrededor del nombre. Debido a estas citas no puedo crear javax.naming.ldap.LdapName de él directamente: falla con NamingException "Nombre inválido".

Entiendo que puedo eliminar estas comillas manualmente, pero esto se siente raro. ¿Hay alguna manera de evitar ese escape? ¿O tal vez hay métodos más limpios para hacer lo que necesito?

pd es gracioso eso Tutorial oficial de JNDI sugiere usar LdapName para lograr una "manipulación fácil de nombres" e incluso menciona el problema de escape, pero no proporciona ningún enlace sobre el problema descrito anteriormente.

preguntado el 27 de julio de 12 a las 16:07

2 Respuestas

Si un AttributeValue tiene sintaxis específica de LDAP, los caracteres se convierten (usando la especificación de sintaxis definida) a UTF-8 y solo se deben escapar los siguientes caracteres:

  • ' ' (espacio) al principio de la cadena
  • ' ' (espacio) al final de la cadena
  • '"'
  • '+' (el carácter más indica un RDN de varios valores)
  • , (el carácter de coma separa los componentes del nombre distinguido)
  • ;
  • <
  • >
  • \

La barra inclinada es un carácter válido y no necesita escaparse, por lo tanto, debe ser manejado por la aplicación y la API utilizada por esa aplicación. Como notó, la barra diagonal tiene un "significado especial" para JNDI. JNDI está mal diseñado en muchos aspectos, este es solo uno de los muchos. Considere usar el SDK de LDAP de Id. ilimitado para código nuevo.

Por ejemplo, agregue la siguiente entrada:

dn: uid=abc/def,ou=people,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: inetOrgPerson
uid: abc/def
cn: abc/def
sn: abc/def
userPassword: this entry is used to test http://stackoverflow.com/questions/11690529/forward-slashes-in-the-names-returned-by-jndi-query-to-ldap-server

recuperar la entrada recién agregada:

ldapsearch -h localhost -p 10389 -D 'cn=RootDn'  -b dc=example,dc=com -s sub '(uid=abc/def)' 1.1
Enter bind password: 
version: 1
dn: uid=abc/def,ou=people,dc=example,dc=com

véase también

Respondido 07 Oct 21, 06:10

Gracias por su respuesta. Desafortunadamente, no puedo usar nada más que JNDI ya que no puedo agregar nuevas dependencias externas al proyecto. Entonces, ¿esencialmente estás diciendo que es imposible superar este problema de una manera limpia? Eso es una lástima... - vladimir matveev

El resultado de búsqueda devuelto por SearchResult.getName() tiene la forma de CompositeName. Intenta usarlo así:

Name itemPart = new CompositeName(result.getName())
Name absoluteName = new LdapName(myBasePath).addAll(itemPart)
// or
String sAbsoluteName = ctx.composeName(new LdapName(myBasePath), itemPart)

Se eliminará el escape extraño de absoluteName.

Respondido el 14 de diciembre de 16 a las 22:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.