Expertise Java & J2EE

Astuces et conseils pour le programmeur raffiné

Comment intéroger un répertoire LDAP avec Java [Permalink]

Fri Mar 14 23:38:30 CET 2008

Lightweight directory access protocol (LDAP) est une technologie extrêmement repandu en entreprise pour les annuaires. Typiquement, lorsque l'autentification des utilisateurs sur une application intranet passe par l'annuaire LDAP, on configure celui-ci avec JAAS dans le web.xml. Mais ceci n'est pas le sujet de cet article. Ici je veux traiter du cas où l'on veut intérogger directement un serveur LDAP et y lancer des recherches, ce qui peut être le cas quand on veut afficher des données qui sont dans l'annuaire, par exemple.

Il se trouve que c'est extrêmement simple de communiquer avec LDAP en Java, surtout parce que toutes les librairies nécessaires sont déjà présents dans le JVM, dans les packages javax.naming. Il n'y a donc rien à installer, même dans une application Java SE.

Une connexion LDAP est représenté par un objet DirContext, typiquement instantié par un InitialDirContext qui prend dans son constructeur un Hashtable contenant les paramètres de connexion. Voici l'incantation magique :

    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY,
        "com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, "ldap://example.com:3060/");
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, "cn=test,cn=Users");
    env.put(Context.SECURITY_CREDENTIALS, "password");
    DirContext ctx = new InitialDirContext(env);

Cet exemple connecte un utilisateur appelé "test" avec un mot de passe "password" au serveur "example.com". Il assume aussi que les utilisateurs se trouvent dans un dossier qui s'appelle "Users". Evidemment ces paramètres sont à modifier en fonction de l'annuaire qu'on veut consulter et sa structure.

Ensuite, on peut passer des requêtes à notre objet ctx. Le syntaxe pour une requête LDAP sera facile à comprendre pour ceux qui connaissent bien le langage Lisp ; malheureusement cette connaissance est de plus en plus rare alors une explication sera peut-être nécessaire...

Les parties de la requête sont regroupés entre parenthèses, avec un opérateur tout de suite après le parenthèse d'ouverture, et les arguments après. Alors là où dans Java ou C on écrit

(a && b && (c || d))
en LDAP ça devient
(& a b (| c d))
Les opérateurs sont & (AND), | (OR), et ! (NOT). Les arguments sont de forme "clef=valeur", où "valeur" peut contenir des étoiles (par exemple, "nom=Dup*"). Les arguments sont eux-même entourés des parenthèses. Voici un exemple complet d'une recherche lancé sur notre ctx, qui est le DirContext qu'on a créé dans le premier exemple :

    SearchControls controls = new SearchControls();
    controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
    NamingEnumeration results = ctx.search("", 
        "(&(uniquemember=cn=test,*)(objectclass=groupofUniqueNames))",
        controls);

La recherche retourne un NamingEnumeration, qui implémente Enumeration et qui est donc facile à itérer.

Et voilà, à vous d'employer les données retrouvés comme bon vous semble dans votre application. N'oubliez pas d'appeler un ctx.close() pour fermer votre connexion quand vous n'en aurez plus besoin!

Trackback for this entry

http://java.craven.fr/blog/java/Java/?permalink=Comment-interoger-un-repertoire-LDAP-avec-Java.html&tb=y


Powered By blojsom
XML  RSS  RDF