2011-12-18 17 views
18

Weblogic, Ejb3.0 kullanıyorum. Java 1.6 üzerinden Active Directory'ye erişmem gerekiyor. Çeşitli yollarla ilgili bilgileri okudum (Kerberos, LDAP)Java ile Active Directory'ye bağlanma

Bunun için bana rahat bir şekilde tavsiyede bulunabilir? Bazı tam kod örnekleri,

teşekkürler, ışını olabilir.

+0

AD'ye erişmek için ne istiyorsunuz? Kerberos normal olarak kimlik doğrulamasıyla sınırlıdır (AD'nin Kerberos biletleri ayrıca Java'dan okumak zor bulabileceğiniz kendi uzantılarını da içerir). LDAP ayrıca kimlik doğrulaması yapabilir, ancak kullanıcı hakkında daha fazla bilgi içeren bir dizindir. Ana fark, SSO için Kerberos'u kullanabilmenizdir. – Bruno

+0

Tam olarak ne istediğini kesinleştir. –

cevap

33

http://docs.oracle.com/javase/tutorial/jndi/ldap/authentication.html
kimlik doğrulaması basit bir koddur Jndi ve çalışma LDAP işlemleri yoluyla Aktif dizini sorgulamak ve bir W2K3 üzerinde JNDI istimal bir LDAP araması yapabilir:

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

Diğer geliştiricilere göre bu güzel ve kolay kod için çok teşekkür ederim. –

11
+0

LDAP veya Kerberos kullanıp kullanmamaya karar vermeliyim? erişmeye çalıştığım Active dizini thayat olabilir Kerberos desteklemiyor mu? – rayman

+0

Kerberos tbh ile biraz yakınlığım var. Sadece AD'ye karşı kimlik doğrulaması yapıyor musunuz yoksa okuma/yazma verileri gibi daha fazlasını yapıyor musunuz? Eğer ikinci olasılıkla LDAP, eğer ilk önce, gerçekten emin değil. – clyfe

+1

@rayman: Kerberos kimlik doğrulama ve yetkilendirme hakkındadır. Bir dizinde saklanan bazı bilgilere erişmek istiyorsanız, LDAP kullanın. Sorunuz biraz geniş, belki ihtiyaçlarınızı açıklayabilirsiniz. – home