1. 程式人生 > >通過LDAP在AD域控上進行新增、刪除、修改、查詢等各種操作

通過LDAP在AD域控上進行新增、刪除、修改、查詢等各種操作

LDAP操作程式碼樣例  初始化LDAP 目錄服務上下文 
該例子中,我們使用uid=linly,ou=People,dc=jsoso,dc=net這個賬號,連結位於本機8389埠的LDAP伺服器(ldap://localhost:8389),認證方式採用simple型別,即使用者名稱/密碼方式。 

private static void initialContext() throws NamingException{ 
   if(singleton == null){ 
    singleton = new LDAPConnection(); 
    /* 
    * 在實際編碼中,這些環境變數應儘可能通過配置檔案讀取 
    */ 
    //LDAP服務地址 
    singleton.sLDAP_URL = "ldap://localhost:8389"; 
    //管理員賬號 
    singleton.sMANAGER_DN = "uid=linly,ou=People,dc=jsoso,dc=net"; 
    //管理員密碼 
    singleton.sMANAGER_PASSWORD = "coffee"; 
    //認證型別 
    singleton.sAUTH_TYPE = "simple"; 
    //JNDI Context工廠類 
    singleton.sCONTEXT_FACTORY = "com.sun.jndi.ldap.LdapCtxFactory"; 
   
    singleton.envProps.setProperty(Context.INITIAL_CONTEXT_FACTORY, singleton.sCONTEXT_FACTORY); 
    singleton.envProps.setProperty(Context.PROVIDER_URL, singleton.sLDAP_URL); 
    singleton.envProps.setProperty(Context.SECURITY_AUTHENTICATION, singleton.sAUTH_TYPE); 
    singleton.envProps.setProperty(Context.SECURITY_PRINCIPAL, singleton.sMANAGER_DN); 
    singleton.envProps.setProperty(Context.SECURITY_CREDENTIALS, singleton.sMANAGER_PASSWORD); 
    /* 
    * 繫結ldap伺服器 
    */ 
    singleton.dirCtx = new InitialDirContext(singleton.envProps); 
   } 


通過一個Hashtable或者Properties物件為LDAP的Context設定引數,而後初始化InitialDirContext,即可繫結LDAP服務。這相當於JDBC中獲取資料庫的Connection物件。 

繫結/建立LDAP條目物件
使用者可以使用bind方法建立新的LDAP條目,下面的程式碼建立一個DN:"ou=Employee , dc=jsoso ,dc=net"的OrganizationUnit類LDAP條目如下: 


public boolean createOrganizationUnit(){ 
   String ldapGroupDN = "ou=Employee , dc=jsoso ,dc=net"; 
   try { 
    /* 
    * 查詢是否已經存在指定的OU條目 
    * 如果存在,則列印OU條目的屬性資訊 
    * 如果不存在,則程式會丟擲NamingException異常,進入異常處理 
    */ 
    Attributes attrs = dirContext.getAttributes(ldapGroupDN); 
    System.out.println("Find the group , attributes list :"); 
    NamingEnumeration<String> nEnum = attrs.getIDs();   
    for( ; nEnum.hasMore() ; ){ 
     String attrID = nEnum.next(); 
     Attribute attr = (Attribute)attrs.get(attrID); 
     System.out.println(attr.toString()); 
    }   
    return false; 
   } catch (NamingException e) { 
    /* 
    * 沒有找到對應的Group條目,新增Group條目 
    */ 
    //建立objectclass屬性 
    Attribute objclass = new BasicAttribute("objectclass"); 
    objclass.add("top"); 
    objclass.add("organizationalunit"); 
    //建立cn屬性 
    Attribute cn = new BasicAttribute("ou", "Employee"); 
    //建立Attributes,並新增objectclass和cn屬性 
    Attributes attrs = new BasicAttributes(); 
    attrs.put(objclass); 
    attrs.put(cn); 
    //將屬性繫結到新的條目上,建立該條目 
    try { 
     dirContext.bind(ldapGroupDN, null, attrs); 
     System.out.println("Group created successful"); 
     return true; 
    } catch (NamingException e1) { 
     e1.printStackTrace(); 
    }    
   } 
   return false; 



獲取條目屬性 
下面一段程式碼獲取entryDN引數指定條目中的屬性集合,並列印到控制檯 

/** 
* 獲取一個指定的LDAP Entry 
* @param entryDN 
*/ 
public void find(String entryDN){ 
   try { 
    Attributes attrs = dirContext.getAttributes(entryDN); 
    if (attrs != null) { 
     NamingEnumeration<String> nEnum = attrs.getIDs(); 
     for( ; nEnum.hasMore() ; ){ 
      String attrID = nEnum.next(); 
      Attribute attr = (Attribute)attrs.get(attrID); 
      System.out.println(attr.toString()); 
     } 
     System.out.println(); 
    }else{ 
     System.out.println("No found binding."); 
    } 
   }catch(NamingException ne) { 
    ne.printStackTrace(); 
   } 


修改條目屬性 
修改DN=user.getDistinguishedName()的條目中的cn、givenname、sn和userpassword四個屬性值。 
(注:引數DirContext.REPLACE_ATTRIBUTE有另外兩個常量:DirContext.ADD_ATTRIBUTE;DirContext.REMOVE_ATTRIBUTE,分別表示新增屬性和刪除屬性。) 

/** 
* 修改使用者資訊 
* @param user 
* @return 
* @throws Exception 
*/ 
public boolean modifyUser(LDAPUser user) throws Exception { 
   //使用者物件為空 
   if (user == null) { 
    throw new Exception("No user information!n"); 
   } 

   //檢查uid 
   String userDN = user.getDistinguishedName(); 
   if (userDN == null && userDN.length() == 0) { 
    throw new NamingException("No userDN you specify!n"); 
   } 

   //判斷使用者條目是否已經存在 
   if(!isUserexist(userDN)){ 
    return false; 
   } 
  
   //設定屬性 
   Attributes attrs = new BasicAttributes(); 
   setBasicAttribute(attrs, "cn", user.getCommomName()); 
   setBasicAttribute(attrs, "givenname", user.getFirstName()); 
   setBasicAttribute(attrs, "sn", user.getLastName()); 
   setBasicAttribute(attrs, "userpassword", user.getPassword()); 
   //修改屬性 
   try{ 
    dirContext.modifyAttributes(user.getDistinguishedName(),DirContext.REPLACE_ATTRIBUTE, attrs); 
    System.out.println("User(" + user.getDistinguishedName() + ") information modified.n"); 
    return true; 
   }catch(NamingException ne){ 
    ne.printStackTrace(); 
   } 
   return false; 




根據屬性集搜尋條目 
根據屬性集matchingAttributes中的匹配值,在上下文DN= "ou=People,dc=jsoso ,dc=net"中搜索它的所有子樹中的匹配條目。 
(注:SearchControls的SCOPE引數詳見SearchControls SCOPE補充說明) 

          /** 
* 通過屬性搜尋LDAP範例 
* @return 
*/ 
public void searchByAttribute(Attributes matchingAttributes){ 
   String baseDN = "ou=People,dc=jsoso ,dc=net"; 
   SearchControls cons = new SearchControls(); 
   cons.setSearchScope(SearchControls.SUBTREE_SCOPE); 
   try { 
    Name baseName = new LdapName(baseDN); 
    NamingEnumeration<SearchResult> ne = dirContext.search(baseName, matchingAttributes); 
    SearchResult entry = null; 
    for(;ne.hasMore();){ 
     entry = ne.next(); 
     showEntry(entry); 
    }     
   } catch (NamingException e) { 
    e.printStackTrace(); 
   } 


根據過濾器搜尋條目 
根據過濾器條件,在上下文DN = "ou=People,dc=jsoso ,dc=net"中,搜尋它的所有子樹中的匹配條目。 
(注:過濾器filter的相關語法詳見LDAP filter語法補充說明) 

/** 
* 通過過濾器搜尋LDAP範例 
* @return 
*/ 
public void searchByFilter(String filter){ 
   String baseDN = "ou=People,dc=jsoso ,dc=net";   
   SearchControls cons = new SearchControls(); 
   cons.setSearchScope(SearchControls.SUBTREE_SCOPE); 
   try { 
    NamingEnumeration<SearchResult> ne = dirContext.search(baseDN, filter , cons); 
    SearchResult entry = null; 
    for(;ne.hasMore();){ 
     entry = ne.next(); 
     showEntry(entry); 
    }     
   } catch (NamingException e) { 
    e.printStackTrace(); 
   }