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}