2010-06-22 1 views
5

Unsere Entwickler verwenden Java auf Linux für verschiedene Dinge (wie die Überprüfung der Mitgliedschaft von Gruppen usw.). Es funktioniert - kein Problem damit! Ich bin kein Entwickler so nackt mit mir.Authentifizieren von Java (Linux) zu Active Directory mit LDAP OHNE Servername

Das Problem ist, dass sie die Servernamen unserer Domänencontroller (LDAP-Server) in ihrem Code fest codiert haben. Jetzt, wenn wir sie durch neuere DCs ersetzen müssen, müssen sie den Code ändern.

Active Directory ist von Natur aus redundant. Der Domain-Name (Beispiel: domain.local) ist ein Round-Robin für alle DCs, die für unser AD verfügbar sind.

Gibt es eine Möglichkeit für den Entwickler, keine Domänencontroller-Servernamen anzugeben, sondern einfach den Active Directory-Domänennamen, und dann wird der Linux-Server die verfügbaren DCs finden und verwenden, welche auch immer läuft?

Beispiele/Links geschätzt. Vielen Dank!

Antwort

8

Offensichtlich sollte der Servername mindestens konfigurierbar sein, nicht fest in der Anwendung codiert sein.

Sie sollten jedoch in der Lage sein, den Server zu finden, indem Sie einen speziellen DNS-Eintrag suchen, nämlich einen SRV-Eintrag für _ldap._tcp.DOMAINNAME. Die Linux-Server müssen so konfiguriert werden, dass sie den gleichen DNS-Server wie Ihre AD-Updates verwenden.

Um festzustellen, ob dies möglich ist, führen Sie den Befehl host -t srv _ldap._tcp.DOMAINNAME auf Ihrem Linux-Server

Siehe auch Querying the DNS service records to find the hostname and TCP/IP bietet einige Informationen darüber, wie SRV-Datensätze in Java zu sehen, und https://community.oracle.com/blogs/kohsuke/2008/06/12/more-active-directory-integration-java

2

Wir verwenden die Folge Code Das funktioniert auf einer großen Anzahl von Systemen:

/** 
* Detect the default LDAP server 
* @return server:port or null 
*/ 
String getDefaultLdapHost() { 
    try { 
     Hashtable<String, String> env = new Hashtable(); 
     env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory"); 
     DirContext dns = new InitialDirContext(env); 

     InetAddress address = InetAddress.getLocalHost(); 
     String domain = address.getCanonicalHostName(); 

     if(domain.equals(address.getHostAddress())) { 
      //domain is a ip address 
      domain = getDnsPtr(dns); 
     } 

     int idx = domain.indexOf('.'); 
     if(idx < 0) { 
      //computer is not in a domain? We will look in the DNS self. 
      domain = getDnsPtr(dns); 
      idx = domain.indexOf('.'); 
      if(idx < 0) { 
       //computer is not in a domain 
       return null; 
      } 
     } 
     domain = domain.substring(idx + 1); 

     Attributes attrs = dns.getAttributes("_ldap._tcp." + domain, new String[] { "SRV" }); 

     Attribute attr = attrs.getAll().nextElement(); 
     String srv = attr.get().toString(); 

     String[] parts = srv.split(" "); 
     return parts[3] + ":" + parts[2]; 
    } catch(Exception ex) { 
     ex.printStackTrace(); 
     return null; 
    } 
} 

/** 
* Look for a reverse PTR record on any available ip address 
* @param dns DNS context 
* @return the PTR value 
* @throws Exception if the PTR entry was not found 
*/ 
private String getDnsPtr(DirContext dns) throws Exception { 
    Exception exception = null; 
    Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); 
    while(interfaces.hasMoreElements()) { 
     NetworkInterface nif = interfaces.nextElement(); 
     if(nif.isLoopback()) { 
      continue; 
     } 
     Enumeration<InetAddress> adresses = nif.getInetAddresses(); 
     while(adresses.hasMoreElements()) { 
      InetAddress address = adresses.nextElement(); 
      if(address.isLoopbackAddress() || address instanceof Inet6Address) { 
       continue; 
      } 
      String domain = address.getCanonicalHostName(); 
      if(!domain.equals(address.getHostAddress()) && (domain.indexOf('.') > 0)) { 
       return domain; 
      } 

      String ip = address.getHostAddress(); 
      String[] digits = ip.split("\\."); 
      StringBuilder builder = new StringBuilder(); 
      builder.append(digits[3]).append('.'); 
      builder.append(digits[2]).append('.'); 
      builder.append(digits[1]).append('.'); 
      builder.append(digits[0]).append(".in-addr.arpa."); 
      try { 
       Attributes attrs = dns.getAttributes(builder.toString(), new String[] { "PTR" }); 
       return attrs.get("PTR").get().toString(); 
      } catch(Exception ex) { 
       exception = ex; 
      } 
     } 
    } 
    if(exception != null) { 
     throw exception; 
    } 
    throw new IllegalStateException("No network"); 
} 
Verwandte Themen