En la primera parte de esta serie de artículos vimos como localizar los controladores de dominio a través del servicio DNS. En la segunda parte nos atrevimos a validar un usuario utilizando simplemente LDAP, y vimos que era fácil. En esta entrada vamos a efectuar una búsqueda en AD según unos parámetros concretos. Para el ejemplo buscaremos un usuario a través de su dirección de correo electrónico, pero este método realmente sirve para cualquier búsqueda que queramos hacer en AD (y de hecho es una búsqueda mediante LDAP).

Lo primero interesante es familiarizarse con los campos y objetos existentes en Active Directory y como son presentados. Para ello he encontrado muy interesante el uso de la herramienta AdExplorer que permite conectar a un controlador de dominio y efectuar búsquedas y operaciones diversas. En esta entrada de blog podemos ver algunos ejemplos. Al final la sintaxis de las llamadas LDAP es sencilla, la dificultad radica en construir la cadena de texto de búsqueda que precisa LDAP.

Un punto importante, que puede parecer obvio quizás, es que necesitamos una sesión válida LDAP para efectuar las búsquedas así que hemos de disponer de un usuario y contraseña válidos para el dominio sobre el que queremos efectuar la búsqueda. Con esos datos podemos establecer una sesión LDAP como vimos en el anterior artículo. A partir de esa sesión lanzar consultas es tan sencillo como el siguiente código:

SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration<SearchResult> resultats = context.search(dominioDC, "(& (mail=" + email + ")(objectClass=user))", controls);

En este ejemplo la búsqueda es de usuarios (objetos de la clase user) y cuyo campo mail sea una dirección de correo electrónico dada. Básicamente, buscamos un usuario a través de su correo electrónico. En este caso la respuesta será única (o vacía si la búsqueda es negativa) pero el mismo mecanismo permite obtener resultados múltiples.Del anterior código quiero destacar el parámetro dominioDC que es el dominio sobre el que efectuamos la búsqueda pero en formato DN. En todo caso la conversión es muy sencilla, separar el dominio por los puntos y crear una lista del estilo DC=net,DC=sargue,DC=www. Como se puede ver, nada complicado. Dejo una función que realiza el cambio (no es mía, la he copiado de algún lugar que ya no recuerdo).

static String toDC(String domainName) {
	StringBuilder buf = new StringBuilder();
	for (String token : domainName.split("\\.")) {
		if (token.length() == 0) continue;   // defensive check
		if (buf.length() > 0) buf.append(",");
		buf.append("DC=").append(token);
	}
	return buf.toString();
}

Entradas relacionadas: