2010-05-21 13 views
4

Je construis une application basée sur GXT (J2EE). Maintenant, le problème est que je dois connecter l'application à un serveur LDAP. Pouvez-vous me dire comment connecter un serveur LDAP à partir de notre application Java et quelle bibliothèque ou API devrais-je utiliser pour cela?Connexion du serveur LDAP à partir de l'application Java

Répondre

7

Pour vous connecter à LDAP, consultez les packages/classes suivantes:

javax.naming.directory.* 
javax.naming.ladp.* 
com.sun.jndi.ldap.LdapCtxFactory 
com.sun.jndi.ldap.ControlFactory 

code Exemple:

//build a hashtable containing all the necessary configuration parameters 
Hashtable<String, String> environment = new Hashtable<String, String>(); 

environment.put(LdapContext.CONTROL_FACTORIES, conf.getProperty("ldap.factories.control")); 
environment.put(Context.INITIAL_CONTEXT_FACTORY, conf.getProperty("ldap.factories.initctx")); 
environment.put(Context.PROVIDER_URL, conf.getProperty("ldap.host")); 
environment.put(Context.SECURITY_AUTHENTICATION, "simple"); 
environment.put(Context.SECURITY_PRINCIPAL, conf.getProperty("ldap.user")); 
environment.put(Context.SECURITY_CREDENTIALS, conf.getProperty("ldap.password")); 
environment.put(Context.STATE_FACTORIES, "PersonStateFactory"); 
environment.put(Context.OBJECT_FACTORIES, "PersonObjectFactory"); 

// connect to LDAP 
DirContext ctx = new InitialDirContext(environment); 

// Specify the search filter 
String FILTER = "(&(objectClass=Person) ((sAMAccountName=" + user.getUsername() + ")))"; 

// limit returned attributes to those we care about 
String[] attrIDs = { "sn", "givenName" }; 

SearchControls ctls = new SearchControls(); 
ctls.setReturningAttributes(attrIDs); 
ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); 

// Search for objects using filter and controls 
NamingEnumeration answer = ctx.search(searchBase, FILTER, ctls); 

... 

SearchResult sr = (SearchResult) answer.next(); 
Attributes attrs = sr.getAttributes(); 
surName = attrs.get("sn").toString(); 
givenName = attrs.get("givenName").toString(); 
... 

Dans cet exemple, j'ai un objet de configuration qui lit ces valeurs à partir d'un fichier de configuration .

Les valeurs seraient:

# LDAP parameters 
ldap.host = ldap://ldap.mydomain.com:389 
ldap.factories.initctx = com.sun.jndi.ldap.LdapCtxFactory 
ldap.factories.control = com.sun.jndi.ldap.ControlFactory 
ldap.searchbase = dc=mydomain,dc=us 
ldap.user = MYDOMAIN.COM\\ldap-user 
ldap.userBase= MYDOMAIN.COM\\ 
ldap.password = ****** 
+0

Dans mon cas, je ne veux pas spécifier un filtre de recherche pour la connexion. En fait, je veux établir la connexion au démarrage de l'application et récupérer des informations chaque fois que nous avons besoin de n'importe quelle partie de l'application. Maintenant, si j'ai besoin de connexions différentes chaque fois que nous essayons de connecter le serveur LDAP ou quoi? Le filtre de recherche est-il obligatoire pour une connexion? – dhiraj

+0

Comment pouvons-nous vérifier si la connexion à un serveur LDAP est réussie ou non? – dhiraj

+0

dhiraj: vous n'avez pas besoin du filtre de recherche pour obtenir la connexion (ie le contexte). En fonction de la fréquence d'accès au LDAP, je garderais la connexion active pour la réutiliser (et la rouvrirais si elle échouait, car elle pourrait être fermée de façon inattendue), ou obtenir une nouvelle connexion à chaque fois (la fermer après chaque temps aussi). Personnellement, je serais favorable à la seconde (à mon humble avis plus robuste). –

-1

Vous pouvez même utiliser Netscape LDAP SDK qui est actuellement pas actif mais donne plus de contrôle dans LDAP Programmation

2
  • connexion à un serveur LDAP est faite en utilisant JNDI (Java Naming et API d'interface) en Java.
  • interfaces de JNDI, des classes et des exceptions sont disponibles dans les paquets suivants sont JDK:..

    • javax.naming *
    • javax.naming.directory *
  • Cela signifie que nous n'avons pas besoin d'utiliser de bibliothèques externes pour travailler avec les serveurs LDAP, dans la plupart des cas.

  • Indique que l'adresse URL d'un serveur LDAP est constituée du nom d'hôte sur lequel le serveur LDAP exécute le numéro de port. Un numéro de port bien connu du protocole Lightweight Directory Access Protocol est 389, ce qui est la valeur par défaut.

  • Vous devez également spécifier certaines propriétés d'environnement pour la connexion et l'authentification dans un objet Hashtable.

Voici l'exemple de code:

import javax.naming.*; 
import javax.naming.ldap.*; 
import javax.naming.directory.*; 

public class Ldap 
{ 
    public static void main(String[]args) 
    { 
     Hashtable<String, String> environment = new Hashtable<String, String>(); 

     environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
     environment.put(Context.PROVIDER_URL, "ldap://<hostname>:389"); 
     environment.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     environment.put(Context.SECURITY_PRINCIPAL, "<Login DN>"); 
     environment.put(Context.SECURITY_CREDENTIALS, "<password>"); 

     try 
     { 
      DirContext context = new InitialDirContext(environment); 
      System.out.println("Connected.."); 
      System.out.println(context.getEnvironment()); 
      context.close(); 
     } 
     catch (AuthenticationNotSupportedException exception) 
     { 
      System.out.println("The authentication is not supported by the server"); 
     } 

     catch (AuthenticationException exception) 
     { 
      System.out.println("Incorrect password or username"); 
     } 

     catch (NamingException exception) 
     { 
      System.out.println("Error when trying to create the context"); 
     } 
    } 
}