Sistema de Nombrado en Java (JNDI) y II

Como la mayor�a de las operaciones sobre directorios LDAP se centran alrededor de los atributos, necesitamos entender c�mo usar esos atributos a trav�s de JNDI.

Los atributos de una entrada LDAP est�n representados por el interface Attributes, mientras que los atributos individuales est�n representados por el interface Attribute. Para crear atributos y usarlos en nuestro programa, deber�amo ssuar las clases BasicAttributes y BasicAttribute.

Aqu� hay un ejemplo que crea dos atributos, "oc" y "photo", y los pone dentro de un objeto Attributes:

// Create a multivalued attribute that has four String values
BasicAttribute oc = new BasicAttribute("objectClass", "top");
oc.add("person");
oc.add("organizationalPerson");
oc.add("inetOrgPerson");

// Create an attribute by using a byte array
BasicAttribute photo = new BasicAttribute("jpegPhoto", buf);

// Create the attribute set
BasicAttributes attrs = new BasicAttributes(true);
attrs.put(oc);
attrs.put(photo);

.�Nombres de Atributos

Identificados un atributo a trav�s de su nombre de atributo, que algunas veces tambi�n es llamado identificador de atributo o nombre de tipo atributo. La lecci�n Operaciones de Directorio explica los nombres de atributos, espec�ficamente cubre la subclasificaci�n de atributos, los sin�nimos de nombres de atributos, y la s�ntaxis para especificar las preferencias de lenguajes. Estas caracter�sticas podr�an no ser soportadas por todas las implementaciones de servidores LDAP.

Los nombres de atributos LDAP no son sensibles a las may�sculas. As� dos nombres de atributos como "objectclass" y "objectClass", ser�an intrepetdos como el mismo atributo. Si estamos usando la clase BasicAttributes para representar atibutos LDAP, deber�amos pasar true en el par�metro ignoreCase de su constructor- Aqu� tenemos algunos ejemplo:

Attributes attrs1 = new BasicAttributes(true);
Attributes attrs2 = new BasicAttributes("objectClass", "top", true); 

.�Opciones

El LDAP v3 permite que se a�adan opciones al nombre de un atributo. Cada opci�n est� precedida por el caracter punto y coma (";"). Las opciones son como subclases de atributos. Es decir, un nombre de atributo nombrado sin opci�n es tratado como la superclase del atributo nombrado con una opci�n. La �nica opci�n definida por el protocolo es binary (que se indica usando el string ";binary"), que significa que el valor del atributo deber�a ser transmitido en formato binario (sin importar su s�ntaxis real). Esta opci�n est� reservada para transmisiones de datos codificados ASN.1 (como certificados "caCertificate;binary"). Los servidores que soporta subclasificaci�n de atributos podr�an soportar identificaci�n del atributo sin su opci�n binary, pero siempre es mejor incluir la opci�n en el nombre del atibuto.

.�Atributos Operacionales

El LDAP v3 soporta la noci�n de atributo operacional, que son atributos asociados con un objeto directorio para prop�sitos administrativos. La lista de control de acceso para un objeto, por ejemplo, es un atributo operacional. En DirContext.getAttributes() y DirContext.search(), podemos suministrar null como la lista de atributos a devolver y as� podemos especificar que se devuelvan todos los atributos asociado con los objetos solicitados. Sin embargo, los atributos devueltos, no incluyen los atributos operacionales. Para recuperar �stos, debemos nombrarlos expl�citamente.

.�Valores de Atributos

Un atributo LDAP puede tener un s�lo valor, o m�ltiples valores desordenados. Si se permite que un atributo tenga m�s de un valor lo dicta la definici�n del atributo en el esquema del directorio. Los dos tipos (un s�lo valor y m�ltiples valores) se represetan en JNDI como un Attribute. En el ejemplo anterior, se cre� un atributo con multiples valores y otro con un s�lo valor.

JNDI es muy flexible en c�mo se pueden representar los valores de atributos seg�n sean declarados como java.lang.Object. Cuando usamos JNDI para acceder o actualizar atributos elmacenados en un directorio particular, los tipos de los valores de atributos dependen del directorio y algunas extensiones, del proveedor de servicios correspondiente. Para el directorio LDAP, el proveedor LDAP de Sun representa los valores de atributos como java.lang.String o byte[]. Los arrays de byte se usan para representar valores de atributos que no tienen s�ntaxis de cadena de texto. Los Strings se usan para representr los valores de todas las dem�s s�ntaxis.

Para un atributo arbitrario, no hay disponible una forma program�tica para determinar si su s�ntaxis no del tipo cadena de texto. Si hay forma manuales, por supuesto, que implica la b�squeda del atributo y su s�ntaxis en documentos como RFC 2256. El proveedor de servicio LDAP tiene una lista interna de nombres de atributos que �l sabe que contiene valores que no son strings y permite a los clientes a�adir a la ista. La siguiente tabla nos ofrece esta lista interna:

Nombre de Atributo OID del Atributo
Todos los nombres de atributos que contiene la opci�n ";binary".
photo 0.9.2342.19200300.100.1.7
personalSignature 0.9.2342.19200300.100.1.53
audio 0.9.2342.19200300.100.1.55
jpegPhoto 0.9.2342.19200300.100.1.60
javaSerializedData 1.3.6.1.4.1.42.2.27.4.1.8
thumbnailPhoto 1.3.6.1.4.1.1466.101.120.35
thumbnailLogo 1.3.6.1.4.1.1466.101.120.36
userPassword 2.5.4.35
userCertificate 2.5.4.36
cACertificate 2.5.4.37
authorityRevocationList 2.5.4.38
certificateRevocationList 2.5.4.39
crossCertificatePair 2.5.4.40
x500UniqueIdentifier 2.5.4.45

Cuando leamos uno de esto atributos desde el directorio LDAP, su valo ser� del tipo byte[].

.�Especificar Atributos no-String Adicionales

Si nuestro programa usa un atributo cuyo valor deber�a devolverse como un array de byte pero su nombre de atributo no est� en la lista, necesitamos a�adir ese nombre a la lista de atributos no-String. Hacemos esto usando la propiedad de entorno "java.naming.ldap.attributes.binary". Su valor es una cadena de nombres de atributos separador por espacios.

Por ejemplo, la siguiente configuraci�n de la propiedad de entorno informa al proveedor LDAP que el valor de los atributos llamados "mpegVideo" y "mySpecialKey" se devuelven como arrays de byte:

env.put("java.naming.ldap.attributes.binary", "mpegVideo mySpecialKey");

.�Eliminar el Retorno de Valores de Atributos

El LDAP v3 nos permite especificar que s�lo se devuelvan los nombres de los tipos de atributo (y no los valores de atributo). Para hacer esto usando el JNDI, configuramos la propiedad de entorno "java.naming.ldap.typesOnly" Esta propiedad afecta a DirContext.getAttributes() y DirContext.search(). Cuando especificamos qu� objetos van a ser devueltos (pasando true a SearchControls.setReturningObjFlag()) y luego llamamos a search(), esta propiedad es ignorada porque los valores de atributos son necesarios para generar el objeto.

Aqu� tenemos un ejemplo que obtiene una lista de los nombres de atributos de una entrada:

// Indicate that you want only the type names
env.put("java.naming.ldap.typesOnly", "true");

// Create initial context
DirContext ctx = new InitialDirContext(env);

// Get the attributes
Attributes attrs = ctx.getAttributes("cn=Ted Geisel, ou=People");

Este ejemplo produce la siguiente salida:

{sn=sn: No values, 
 objectclass=objectclass: No values, 
 jpegphoto=jpegphoto: No values, 
 mail=mail: No values, 
 facsimiletelephonenumber=facsimiletelephonenumber: No values, 
 telephonenumber=telephonenumber: No values, cn=cn: No values}

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR