[Retour index]

Accès à un annuaire LDAP en JAVA (avec JNDI)

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

1. 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


Un commentaire, une remarque? - 1 commentaire(s) :

aa a commenté, le 25/05/2011 à 04:25:05 :
merci bb


MAJ le 20/06/2005
Valid XHTML 1.1! Valid CSS!