AD 域服務簡介(二)- Java 獲取 AD 域用戶


博客地址:http://www.moonxy.com

關於AD 域服務器搭建及其使用,請參閱:AD 域服務簡介(一) - 基於 LDAP 的 AD 域服務器搭建及其使用

一、前言

先簡單簡單回顧上一篇博文中關於 AD 域和 LDAP目錄訪問協議的基本概念。

AD(Active Directory)活動目錄,動態的建立整個域模式網絡中的對象的數據庫或索引,使用的協議為 LDAP,安裝了AD 的服務器稱為 DC 域控制器,存儲整個域的對象的信息並周期性更新,其中的對象分為三大類:資源(如印表機)、服務(如電子郵件)、和用戶(即帳戶或用戶,以及組)。

通常大家都會將 LDAP 與關系數據庫相比,認為 LDAP 是另一種的存貯方式,然后在讀性能上進行比較。實際上,這種對比的基礎是不正確的。LDAP 和關系數據庫是兩種不同層次的概念,后者是存貯方式(同一層次如網絡數據庫,對象數據庫),前者是存貯模式和訪問協議。LDAP 是一個比關系數據庫抽象層次更高的存貯概念,與關系數據庫的查詢語言 SQL 屬同一級別。LDAP 最基本的形式是一個連接數據庫的標准方式。該數據庫為讀查詢作了優化。因此它可以很快地得到查詢結果,不過在其它方面,例如更新,就慢得多。

二、Java 獲取 AD 域用戶

Java 獲取 AD 域用戶通常用於單點登錄(Single Sign On,SSO)。

package com.moonxy.ad;

import java.util.Properties;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

/**
 * @Description:獲取AD域用戶
 * @author moonxy
 * @date 2018-05-14
 */
public class ADUtils {
    public static void main(String[] args) {
        Properties env = new Properties();
        //使用UPN格式:User@domain或SamAccountName格式:domain\\User
        String adminName = "administrator@moonxy.com";
        String adminPassword = "smartdot&2014";//password
        String ldapURL = "LDAP://192.168.1.103:389";//ip:port

        env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");//LDAP訪問安全級別:"none","simple","strong"
        env.put(Context.SECURITY_PRINCIPAL, adminName);// AD User
        env.put(Context.SECURITY_CREDENTIALS, adminPassword);// AD Password 
        env.put(Context.PROVIDER_URL, ldapURL);// LDAP工廠類
        
        try {
            LdapContext ctx = new InitialLdapContext(env, null);
            //搜索控制器
            SearchControls searchCtls = new SearchControls();
            //創建搜索控制器 
            searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
            //LDAP搜索過濾器類,此處只獲取AD域用戶,所以條件為用戶user或者person均可
            //(&(objectCategory=person)(objectClass=user)(name=*))
            String searchFilter = "objectClass=user";
            //AD域節點結構
            String searchBase = "OU=Java開發組,OU=軟件研發部,DC=moonxy,DC=com";
            
            String returnedAtts[] = { "url", "employeeID",  "mail",
                    "name", "userPrincipalName", "physicalDeliveryOfficeName",  
                    "departmentNumber", "telephoneNumber", "homePhone",  
                    "mobile", "department", "sAMAccountName", "whenChanged"}; // 定制返回屬性
            searchCtls.setReturningAttributes(returnedAtts);
            NamingEnumeration<SearchResult> answer = ctx.search(searchBase, searchFilter,searchCtls);
            
            while (answer.hasMoreElements()) {
                SearchResult sr = (SearchResult) answer.next();
                System.out.println("<<<::[" + sr.getName()+"]::>>>>");//返回格式一般是CN=xxxx,OU=xxxx
                Attributes Attrs = sr.getAttributes();//得到符合條件的屬性集  
                if (Attrs != null) {
                    for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore();) {
                        Attribute Attr = (Attribute) ne.next();//得到下一個屬性
                        System.out.print(Attr.getID().toString() + ":");
                        //讀取屬性值
                        for (NamingEnumeration e = Attr.getAll(); e.hasMore();) {
                            String userInfo =  e.next().toString();
                            System.out.print(userInfo);
                        }
                        System.out.println("");
                    }
                }
            }
            ctx.close();
        }catch (NamingException e) {
            e.printStackTrace();
            System.err.println("Problem searching directory: " + e);
        }
    }
}

輸出的結果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM