Ldap/java

Messages postés
14
Date d'inscription
mercredi 22 décembre 2010
Statut
Membre
Dernière intervention
23 juillet 2012
- - Dernière réponse :  reuqnas - 2 mai 2013 à 15:21
bonjour
je travailles sur un application java pour authentifier les utilisateurs via ldap.
je dois d'abord faire la connexion a ldap a l'aide de JNDI,pour cela jé telecharger la librairie jndi.jar depuis le site de sun mais je sais pas ou est ce que je vais la mettre pour l'exploiter??
Afficher la suite 

7 réponses

Messages postés
51
Date d'inscription
jeudi 10 mai 2012
Statut
Membre
Dernière intervention
5 juillet 2012
0
Merci
Salut !

Personnellement, j'me connecte à LDAP sans JNDI:

Le username passé en paramètre c'est pour effectuer une recherche en filtrant avec son nom

    /**
     * Constructeur
     * @param username Le nom de l'utilisateur actuel
     */
    public LDAP_Auth(String username)
    {
        //Assignation de la variable username
        this.USERNAME = username;
        
        //Création de table contenant les données pour la connexion
        Hashtable env = new Hashtable();
        
        //Contexte initial
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        
        //Adresse du serveur LDAP
        env.put(Context.PROVIDER_URL, "ldap://QUETZALCOATL:389/");
        
        //Demande login + mot de passe
        env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
        
        //Identifiant de connexion au serveur LDAP
        env.put(Context.SECURITY_PRINCIPAL, "ildap@owa"); 
        
        //Mot de passe
        env.put(Context.SECURITY_CREDENTIALS, "7rUCq1qC0n" ); 
        
        try
        {
            //Connexion au LDAP
            DirContext CTX = new InitialDirContext(env);
        }//try
        catch (NamingException ex)
        {
            //On affiche un message d'erreur
            System.out.println("Erreur lors de la tentative de connexion :\n" + ex.getMessage() );
            return false;
        }//catch (NamingException ex)

        //On affiche un message pour indiquer que l’authentification a réussi
        System.out.println("Authentification réussie pour l'utilisateur " + username);
    }//public LDAP_Auth(String username)


Si tu cherche juste à t'authentifier, et pas faire de recherche ensuite, j'peux te proposer ça:

    /**
     * Indique si le couple username/password est correct
     * @param username Le nom de l'utilisateur
     * @param password Le mot de passe de l'utilisateur
     */
    public static boolean authentified(String username, String password)
    {        
        //Création de table contenant les données pour la connexion
        Hashtable env = new Hashtable();
        
        //Contexte initial
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        
        //Adresse du serveur LDAP
        env.put(Context.PROVIDER_URL, "ldap://QUETZALCOATL:389/"); //remplace par ton LDAP
        
        //Demande login + mot de passe
        env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
        
        //Identifiant de connexion au serveur LDAP
        env.put(Context.SECURITY_PRINCIPAL, username); 
        
        //Mot de passe
        env.put(Context.SECURITY_CREDENTIALS, password ); 
        
        try
        {
            //Connexion au LDAP
            this.CTX = new InitialDirContext(env);
        }//try
        catch (NamingException ex)
        {
            //On affiche un message d'erreur
            System.out.println("Erreur lors de la tentative de connexion :\n" + ex.getMessage() );
        }//catch (NamingException ex)
    }//public static boolean authentified(String username, String password)


Attention cependant au username
Chez nous quand on se logue, c'est QUETZALCOATL\login + mot de passe
Et là dans mon java, je dois mettre comme username login@owa (le domaine)
Commenter la réponse de lossehelin
Messages postés
51
Date d'inscription
jeudi 10 mai 2012
Statut
Membre
Dernière intervention
5 juillet 2012
0
Merci
J'ai oublié les return:

   /**
     * Indique si le couple username/password est correct
     * @param username Le nom de l'utilisateur
     * @param password Le mot de passe de l'utilisateur
     */
    public static boolean authentified(String username, String password)
    {        
        //Création de table contenant les données pour la connexion
        Hashtable env = new Hashtable();
        
        //Contexte initial
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        
        //Adresse du serveur LDAP
        env.put(Context.PROVIDER_URL, "ldap://QUETZALCOATL:389/"); //remplace par ton LDAP
        
        //Demande login + mot de passe
        env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
        
        //Identifiant de connexion au serveur LDAP
        env.put(Context.SECURITY_PRINCIPAL, username); 
        
        //Mot de passe
        env.put(Context.SECURITY_CREDENTIALS, password ); 
        
        try
        {
            //Connexion au LDAP
            this.CTX = new InitialDirContext(env);
        }//try
        catch (NamingException ex)
        {
            //On affiche un message d'erreur
            System.out.println("Erreur lors de la tentative de connexion :\n" + ex.getMessage() );
            return false;
        }//catch (NamingException ex)
        
        //Affichage d'un message pour indiquer la réussite
        System.out.println("L'authentification de l'utilisateur " + username + " a réussi !";
        return true;
    }//public static boolean authentified(String username, String password)
Commenter la réponse de lossehelin
Messages postés
14
Date d'inscription
mercredi 22 décembre 2010
Statut
Membre
Dernière intervention
23 juillet 2012
0
Merci
Merci bien pour votre réponse,ainsi pour votre rapidité de réponse,mais en plus de la connexion je cherche aussi à parcourir l'annuaire,à modifier,supprimer..
Cordialement,
Commenter la réponse de 5ou5a2012
Messages postés
51
Date d'inscription
jeudi 10 mai 2012
Statut
Membre
Dernière intervention
5 juillet 2012
0
Merci
Alors pour modifier/supprimer, je ne sais pas vraiment, je n'ai fait que de la consultation.
Je vous donne ma classe entière "LDAP_Auth":

package merguez.process.ldap;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.*;

/**
 *  Cette classe permet de s'authentifier sur le serveur LDAP en vue de vérifier l'appertenance à certains groupes de l'utilisateurs
 * @author asorg
 */
public class LDAP_Auth 
{
    //Login de l'utilisateur
    private String USERNAME = null;
    //Connexion au LDAP
    private DirContext CTX = null;
    
    /**
     * Constructeur
     * @param username Le nom de l'utilisateur actuel
     */
    public LDAP_Auth(String username)
    {
        //Assignation de la variable username
        this.USERNAME = username;
        
        //Création de table contenant les données pour la connexion
        Hashtable env = new Hashtable();
        
        //Contexte initial
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        
        //Adresse du serveur LDAP
        env.put(Context.PROVIDER_URL, "ldap://QUETZALCOATL:389/");
        
        //Demande login + mot de passe
        env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
        
        //Identifiant de connexion au serveur LDAP
        env.put(Context.SECURITY_PRINCIPAL, "ildap@owa"); 
        
        //Mot de passe
        env.put(Context.SECURITY_CREDENTIALS, "7rUCq1qC0n" ); 
        
        try
        {
            //Connexion au LDAP
            this.CTX = new InitialDirContext(env);
        }//try
        catch (NamingException ex)
        {
            //On affiche un message d'erreur
            System.out.println("Erreur lors de la tentative de connexion :\n" + ex.getMessage() );
        }//catch (NamingException ex)
    }//public LDAP_Auth(String username)
    
    /**
     * Cette fonction renvoie la liste des groupes dont l'utilisateur fait parti
     * @return La liste des groupes dont l'utilisateur fait parti
     */
    public ArrayList<String> getGroups()
    {
        //Création de liste qui contiendra tous les groupes dont fait parti l'utilisateur
        ArrayList<String> res = new ArrayList<String>();
        
        //Base dans laquelle se trouve l'utilisateur
        String BASE = "OU=Utilisateurs,OU=Walter,DC=QUETZALCOATL,DC=CHAC,DC=LOCAL"; 
        
        //Filtre de recherche permettant de n'obtenir que les informations concernant l'utilisateur logué
        String filter = "(userPrincipalName=" + this.USERNAME + "@owa)"; 
        
        //Création d'un élément pour la recherche d'information
        SearchControls sc = new SearchControls();
        sc.setSearchScope(SearchControls.SUBTREE_SCOPE);

        NamingEnumeration items = null; 
        try
        {
            //Récupération des informations dans la BASE, avec le filter appliqué comme filtre, et SC  comme méthode recherche
            items = this.CTX.search(BASE, filter, sc);
        }//try
        catch (NamingException ex)
        {
            //On affiche un message d'erreur
            System.out.println("Erreur lors de la recherche :\n" + ex.getMessage() );
        }//catch (NamingException ex)
        try
        {
            //Tant qu'items n'est pas null, et qu'il y a encore des résultats
            while (items != null && items.hasMore())
            {
                //On prend le résultat suivant
                SearchResult sr = (SearchResult)items.next();
                
                //On récupère ses attibruts
                Attributes attrs = sr.getAttributes();
                
                //On récupère l'attributs memberOf qui contient les groupes de l'utilisateur
                Attribute att = attrs.get("memberOf");
                
                //On récupère tous les éléments de cet attribut
                Enumeration enu = att.getAll();
                
                //Tant qu'enu n'est pas null, et qu'il y a des éléments
                while( enu != null && enu.hasMoreElements() )
                {
                    //On ajoute le groupe à la liste de groupes de l'utilisateur
                    res.add( enu.nextElement().toString() );
                }//while( enu != null && enu.hasMoreElements() )
            }//while (items != null && items.hasMore())
        }//try
        catch (NamingException ex)
        {
            //On affiche un message d'erreur
            System.out.println("Erreur lors de la récupération des attributs de l'utilisateur :\n" + ex.getMessage() );
        }//catch (NamingException ex)
        
        //On renvoie la liste de groupes dont fait l'utilisateur
        return res;
    }//public ArrayList<String> getGroups()
}//public class LDAP_Auth 


Comme son nom l'indique, ma fonction getGroups permet de récupérer tous les groupes dont fait parti l'utilisateur, je vous laisse regarder et essayer de comprendre
Je pense que pour la consultation, elle est facilement adaptable à tous les autres attributs
Commenter la réponse de lossehelin
Messages postés
14
Date d'inscription
mercredi 22 décembre 2010
Statut
Membre
Dernière intervention
23 juillet 2012
0
Merci
merci, je vais essayer de le comprendre et je vous mets au courant,
Commenter la réponse de 5ou5a2012
Messages postés
5
Date d'inscription
samedi 30 juin 2012
Statut
Membre
Dernière intervention
13 juillet 2012
0
Merci
bonjour,

je dois vérifier la signature d'un document pour ce je dois utiliser LDAP pour lui communiquer le certificat et récupérer la clé publique nécessaire à la validation de la signature mais je sais pas comment y procéder :( ! si quelqu'un pourrait m'aider SVP
Commenter la réponse de linnnou
0
Merci
Bonjour,

comment créer t on un nouvelle utilisateur dans l'active directory j'ai quasiment le meme principe que votre code pour me connecter mais par contre pour la création j'ai des messages d'erreur

Merci
Commenter la réponse de reuqnas