Java使用LdAP獲取AD域用戶


隨着我們的習大大上台后,國家在網絡信息安全方面就有了非常明顯的改變!所以如今好多做網絡信息安全產品的公司和須要網絡信息安全的公司都會提到用AD域server來驗證,這里就簡單的研究了一下!

先簡單的講講AD域和LdAP文件夾訪問協議:AD(active directory)活動文件夾,動態的建立整個域模式網絡中的對象的數據庫或索引,協議為LDAP,安裝了AD的server稱為DC域控制器,存儲整個域的對象的信息並周期性更新!當中的對象分為三大類——資源(如印表機)、服務(如電子郵件)、和人物(即帳戶或用戶,以及組)。 

LDAP是一個用來公布文件夾信息到很多不同資源的協議。通常它都作為一個集中的地址被使用,只是依據組織者的須要,它能夠做得更加強大。
LDAP事實上是一個電話簿,類似於我們所使用諸如NIS(Network Information Service)、DNS (Domain Name Service)等網絡文件夾,也類似於你在花園中所示樹木。
不少LDAP開發者喜歡把LDAP與關系數據庫相比,覺得是還有一種的存貯方式,然后在讀性能上進行比較。實際上,這樣的對照的基礎是錯誤的。LDAP和關系數據庫是兩種不同層次的概念,后者是存貯方式(同一層次如網絡數據庫,對象數據庫),前者是存貯模式和訪問協議。LDAP是一個比關系數據庫抽象層次更高的存貯概念,與關系數據庫的查詢語言SQL屬同一級別。LDAP最主要的形式是一個連接數據庫的標准方式。該數據庫為讀查詢作了優化。因此它能夠非常快地得到查詢結果,只是在其他方面,比如更新,就慢得多。AD域和LdAP文件夾訪問協議就介紹到這里!以下來看看簡單的demo吧!

/**
 * @Description: 
 *
 * @Title: LdAPTest.java
 * @Package com.joyce.itext.main
 * @Copyright: Copyright (c) 2014
 *
 * @author Comsys-LZP
 * @date 2014-8-7 上午10:20:22
 * @version V2.0
 */
package com.joyce.itext.main;

import java.util.Properties;

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

/**
 * @Description:拉取AD域賬戶
 * 
 * @ClassName: LdAPTest
 * @Copyright: Copyright (c) 2014
 * 
 * @author Comsys-LZP
 * @date 2014-8-7 上午10:20:22
 * @version V2.0
 */
public class LdAPTest {
	public static void main(String[] args) {
		Properties env = new Properties();
		String adminName = "administrator@2003.com";//username@domain
		String adminPassword = "admin";//password
		String ldapURL = "LDAP://10.10.2.153:389";//ip:port
		env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
		env.put(Context.SECURITY_AUTHENTICATION, "simple");//"none","simple","strong"
		env.put(Context.SECURITY_PRINCIPAL, adminName);
		env.put(Context.SECURITY_CREDENTIALS, adminPassword);
		env.put(Context.PROVIDER_URL, ldapURL);
		try {
			LdapContext ctx = new InitialLdapContext(env, null);
			SearchControls searchCtls = new SearchControls();
			searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
			String searchFilter = "(&(objectCategory=person)(objectClass=user)(name=*))";
			String searchBase = "DC=2003,DC=com";
			String returnedAtts[] = {"memberOf"};
			searchCtls.setReturningAttributes(returnedAtts);
			NamingEnumeration<SearchResult> answer = ctx.search(searchBase, searchFilter,searchCtls);
			while (answer.hasMoreElements()) {
				SearchResult sr = (SearchResult) answer.next();
				System.out.println("<<<::[" + sr.getName()+"]::>>>>");
			}
			ctx.close();
		}catch (NamingException e) {
			e.printStackTrace();
			System.err.println("Problem searching directory: " + e);
		}
	}
}

以上就是從AD域上拉取域賬號!當然如今Java還有更多的jar也能操作AD域,這里不就不多介紹了,有興趣的同伴能夠去百度、谷歌!最后給大伙兒看看效果圖:

還想多說一句,事實上Java原生態的API老好了,所以能用原生態的最好,由於別人提供的jar包假設沒有處理好的話,還不如原生態的呢!感謝大家的關注


免責聲明!

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



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