2010-06-22 8 views
5

Các nhà phát triển của chúng tôi sử dụng Java trên Linux cho nhiều thứ khác nhau (như kiểm tra thành viên của nhóm, v.v.). Nó hoạt động - không có vấn đề với điều đó! Tôi không phải là một nhà phát triển để trần với tôi.Xác thực từ Java (Linux) sang Active Directory bằng LDAP KHÔNG có servername

Vấn đề là họ đã mã hóa cứng tên máy chủ của Bộ kiểm soát miền của chúng tôi (máy chủ LDAP) trong mã của họ. Vì vậy, bây giờ khi chúng ta cần phải thay thế chúng bằng các DC mới hơn, chúng cần thay đổi mã.

Thư mục hoạt động theo bản chất là không cần thiết. Tên miền (ví dụ: domain.local) là một vòng tròn của tất cả các DC: s có sẵn cho AD của chúng tôi.

Có cách nào để nhà phát triển KHÔNG chỉ định tên máy chủ Bộ điều khiển tên miền mà chỉ đơn giản là tên miền Active Directory và sau đó máy chủ Linux của họ sẽ tìm thấy DC: s có sẵn và sử dụng cái nào đang hoạt động?

Ví dụ/liên kết được đánh giá cao. Cảm ơn!

Trả lời

8

Rõ ràng, tên máy chủ ít nhất phải được cấu hình, không được mã hóa cứng vào ứng dụng.

Tuy nhiên, bạn sẽ có thể tìm thấy máy chủ bằng cách tra cứu bản ghi DNS đặc biệt, cụ thể là bản ghi SRV cho _ldap._tcp.DOMAINNAME. Các máy chủ Linux phải được cấu hình để sử dụng cùng một máy chủ DNS như các bản cập nhật AD của bạn.

Để xác định liệu này là khả thi, hãy chạy lệnh host -t srv _ldap._tcp.DOMAINNAME trên máy chủ Linux của bạn

Xem thêm Querying the DNS service records to find the hostname and TCP/IP cung cấp một số thông tin về làm thế nào để tìm kiếm các bản ghi SRV trong java, và https://community.oracle.com/blogs/kohsuke/2008/06/12/more-active-directory-integration-java

2

Chúng tôi sử dụng mã sau hoạt động trên một số lượng lớn hệ thống:

/** 
* 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"); 
}