2011-12-18 19 views
18

Sto usando Weblogic, Ejb3.0. Java 1.6Come connettersi con Java in Active Directory

Ho bisogno di accedere ad Active Directory tramite codice Java. Ho letto su diversi modi (Kerberos, LDAP)

Chiunque poteva consigliarmi su come farlo in modo comodo? dove potrei avere alcuni esempi completi di codice,

grazie, raggio.

+0

Per cosa si desidera accedere a AD? Kerberos è normalmente limitato all'autenticazione (sebbene i ticket di Kerberos di AD contengano anche alcune proprie estensioni, che potresti trovare difficili da leggere da Java). LDAP può fare anche l'autenticazione, ma è anche una directory con ulteriori informazioni sull'utente. La differenza principale è che è possibile utilizzare Kerberos per SSO. – Bruno

+0

Sii più preciso di ciò che vuoi esattamente. –

risposta

33

Ecco un semplice codice che l'autenticazione e fare una ricerca LDAP usin JNDI su una W2K3:

class TestAD 
{ 
    static DirContext ldapContext; 
    public static void main (String[] args) throws NamingException 
    { 
    try 
    { 
     System.out.println("Début du test Active Directory"); 

     Hashtable<String, String> ldapEnv = new Hashtable<String, String>(11); 
     ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
     //ldapEnv.put(Context.PROVIDER_URL, "ldap://societe.fr:389"); 
     ldapEnv.put(Context.PROVIDER_URL, "ldap://dom.fr:389"); 
     ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     //ldapEnv.put(Context.SECURITY_PRINCIPAL, "cn=administrateur,cn=users,dc=societe,dc=fr"); 
     ldapEnv.put(Context.SECURITY_PRINCIPAL, "cn=jean paul blanc,ou=MonOu,dc=dom,dc=fr"); 
     ldapEnv.put(Context.SECURITY_CREDENTIALS, "pwd"); 
     //ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl"); 
     //ldapEnv.put(Context.SECURITY_PROTOCOL, "simple"); 
     ldapContext = new InitialDirContext(ldapEnv); 

     // Create the search controls   
     SearchControls searchCtls = new SearchControls(); 

     //Specify the attributes to return 
     String returnedAtts[]={"sn","givenName", "samAccountName"}; 
     searchCtls.setReturningAttributes(returnedAtts); 

     //Specify the search scope 
     searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); 

     //specify the LDAP search filter 
     String searchFilter = "(&(objectClass=user))"; 

     //Specify the Base for the search 
     String searchBase = "dc=dom,dc=fr"; 
     //initialize counter to total the results 
     int totalResults = 0; 

     // Search for objects using the filter 
     NamingEnumeration<SearchResult> answer = ldapContext.search(searchBase, searchFilter, searchCtls); 

     //Loop through the search results 
     while (answer.hasMoreElements()) 
     { 
     SearchResult sr = (SearchResult)answer.next(); 

     totalResults++; 

     System.out.println(">>>" + sr.getName()); 
     Attributes attrs = sr.getAttributes(); 
     System.out.println(">>>>>>" + attrs.get("samAccountName")); 
     } 

     System.out.println("Total results: " + totalResults); 
     ldapContext.close(); 
    } 
    catch (Exception e) 
    { 
     System.out.println(" Search error: " + e); 
     e.printStackTrace(); 
     System.exit(-1); 
    } 
    } 
} 
+0

Grazie mille per questo codice bello e facile che è fantastico di altri sviluppatori –

11
+0

Quindi, dovrei decidere se utilizzare LDAP o Kerberos? potrebbe essere thaat la directory attiva che sto cercando di accedere non supporta Kerberos? – rayman

+0

Ho poca familiarità con Kerberos tbh. Stai solo autenticando contro AD o fai di più, come leggere/scrivere dati? Se il secondo probabilmente LDAP, se prima, non è proprio sicuro. – clyfe

+1

@rayman: Kerberos riguarda l'autenticazione e l'autorizzazione. Se si desidera accedere ad alcune informazioni memorizzate in una directory, utilizzare LDAP. La tua domanda è un po 'ampia, forse puoi delineare le tue esigenze. – home

Problemi correlati