[index des documents]

Conception et mise en oeuvre d'un Service d'Archivage

JAVA - Connexion/Recherche LDAP (avec JNDI)

L'idée est de pouvoir se connecter à un annuaire LDAP avec JNDI (Java Naming and Directory Interface). L'annuaire utilisé est celui de l'ENST-BRETAGNE accessible localement (sur le site de RENNES) à l'adresse http://ldap.rennes.enst-bretagne.fr:389.
Recherche basique
Recherche avec filtre
Quelques liens

Recherche basique

La meilleure documentation est bien sûr sur le site java.sun.com. Le lien suivant montre comment faire une recherche simple :
L'exemple suivant utilise la "recherche basique" pour trouver les attributs de l'utilisateur alenorcy :
import javax.naming.*;
import javax.naming.directory.*;
import java.util.Hashtable;

class RechercheBasique {
    public static void main(String[] args) {

	// Set up the environment for creating the initial context
	Hashtable env = new Hashtable(11);
	env.put(Context.INITIAL_CONTEXT_FACTORY, 
	    "com.sun.jndi.ldap.LdapCtxFactory");
	env.put(Context.PROVIDER_URL, "ldap://ldap.rennes.enst-bretagne.fr");
	try {
	    // Create initial context
	    DirContext ctx = new InitialDirContext(env);

	    Attributes matchAttrs = new BasicAttributes(true);
	    matchAttrs.put(new BasicAttribute("cn", "alenorcy"));
	    //matchAttrs.put(new BasicAttribute("mail"));

	    // Search for objects that have those matching attributes
	    NamingEnumeration answer = 
		ctx.search("ou=autre personnel,o=personnel,dc=enst-bretagne,dc=fr", matchAttrs);

	    while (answer.hasMore()) {
	        SearchResult sr = (SearchResult)answer.next();
	        System.out.println(">>>" + sr.getName());
	        System.out.println(sr.getAttributes());
	    }
	    // Close the context when we're done
	    ctx.close();
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }//main
}//class
La classe est disponible ici
Compilation :
[root@localhost root]# javac RechercheBasique.java
Exécution :
[root@localhost root]# java RechercheBasique
Affichage du résultat :
>>>uid=alenorcy
{sn=sn: alenorcy, loginshell=loginShell: /bin/tcsh, uidnumber=uidNumber: 8433, 
gidnumber=gidNumber: 903, mail=mail: Arnaud.LENORCY@enst-bretagne.fr, 
objectclass=objectClass: person, organizationalPerson, inetOrgPerson, posixAccount, 
shadowAccount, uid=uid: alenorcy, gecos=gecos: LE NORCY Arnaud - Stag. DISI, 
registeredaddress=registeredAddress: alenorcy@rennes, cn=cn: alenorcy, 
homedirectory=homeDirectory: /users/disi/stage/alenorcy}

Recherche avec filtre

Toujours issue de la doc de Sun, voici comment faire une recherche un peu plus complexe (avec filtre de recherche) :
A l'aide de la doc de Sun et d'exemples, développons notre propre classe permettant d'afficher l'adresse email de l'utilisateur alenorcy :
import java.util.Hashtable;
import java.util.Enumeration;
import javax.naming.*;
import javax.naming.directory.*;

/**
 * 
 * Classe permettant la recherche et l'affichage de données issues
 * d'un annuaire LDAP
 *  
 */
class RechercheLDAP {

	// Cette méthode rend la prmier valeur d'un attribut pour un DN donnée d'une
	// base LDAP.
	public static String RechercheElementJNDI(String annuaire, String dnDeBase,
			String filtre, String attribut) {
		Hashtable env = new Hashtable();

		//Fournisseur de service d'annuaire
		env.put(Context.INITIAL_CONTEXT_FACTORY,
				"com.sun.jndi.ldap.LdapCtxFactory");

		//Adresse de l'annuaire LDAP
		env.put(Context.PROVIDER_URL, annuaire);

		//Identification (en commentaire dans le cas d'un bind anonyme)
		//env.put(Context.SECURITY_AUTHENTICATION, "simple");
		//env.put(Context.SECURITY_PRINCIPAL, "cn=Manager");
		//env.put(Context.SECURITY_CREDENTIALS, "secret");

		try {
			//Recuperer un pointeur sur contexte
			DirContext ctx = new InitialDirContext(env);

			//Options de recherche
			SearchControls constraints = new SearchControls();
			constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

			//Indication du DN de la base et du filtre de recherche
			NamingEnumeration results = ctx.search(dnDeBase, filtre,
					constraints);

			//Pour chaque entrée, afficher les attributs
			while (results != null && results.hasMore()) {
				//Lecture d'une entrée
				SearchResult entry = (SearchResult) results.next();

				Attributes attrs = entry.getAttributes();
				if (attrs == null) {
					// aucun attributs associés à ce DN...
					return null;
				} else {
					//Parcours de tous les attributs
					for (NamingEnumeration attEnum = attrs.getAll();
					attEnum.hasMoreElements();) {
						Attribute attr = (Attribute) attEnum.next();
						String attrId = attr.getID();
						if (attrId.equals(attribut)) {
							Enumeration vals = attr.getAll();
							vals.hasMoreElements();
							// Retour de la première valeur de l'attribut
							return (vals.nextElement().toString());
						}
					}
				}
			}
		} catch (NamingException e) {
			System.err.println("La recherche a echouee");
			e.printStackTrace();
		}
		return null;
	}
}	
La fonction suivante permet de tester la fonction RechercheElementJNDI pour faire une recherche sur l'adresse email de l'utilisateur alenorcy :
// fonction "main" permettant les tests. 
public static void main(String[] args) {
		
	// Affichage de l'adresse email de l'utilisateur "alenorcy"  :
	System.out.println(RechercheElementJNDI(
			"ldap://ldap.rennes.enst-bretagne.fr:389",
			"o=personnel,dc=enst-bretagne,dc=fr", "cn=alenorcy", "mail"));
}
La classe entière (avec la fonction main) est disponible ici
Compilation :
[root@localhost root]# javac RechercheLDAP.java
Exécution :
[root@localhost root]# java RechercheLDAP
Affichage du résultat :
Arnaud.LENORCY@enst-bretagne.fr

Quelques liens


MAJ le 20/06/2005