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