寫在前面
由于最近的一個項目的需求是要是需要讀取AD域里面的一些數據,然后保存到數據庫中,所以對LDAP這個東西進行了一些研究。
感謝以下鏈接提供的資料 :
http://wibiline.VEvb.com/blog/1840739
http://aa00aa00.VEvb.com/blog/1276936
http://www.companysz.com/forbreak/archive/2012/10/30/2746464.html
http://cgs1999.VEvb.com/blog/1574635
http://www.companysz.com/awpatp/archive/2010/02/14/1668097.html
項目需求
已知一個節點 "CN=Authorization2,CN=PRogram Data Test,DC=cayzlh,DC=com",需要得到節點下的某個節點里面的相關屬性,然后提取出來,保存到數據庫中。

解決問題
獲得LDAP連接
public class LdapADHelper {
private final String URL = "ldap://"+"192.168.1.204:389";
private final String ADMINPASSWord = "test123"; private LdapContext ctx = null;
public static LdapADHelper getInstance() throws NamingException{
return new LdapADHelper();
}
private LdapADHelper () throws NamingException {
this.initLdap();
}
/**
* 初始化ldap
* @throws NamingException
*/
private void initLdap() throws NamingException {
// ad服務器
Hashtable<String, String> HashEnv = new Hashtable<String, String>();
HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); // LDAP訪問安全級別
HashEnv.put(Context.SECURITY_PRINCipAL, this.ADMINNAME); // AD User HashEnv.put(Context.SECURITY_CREDENTIALS, this.ADMINPASSWORD); // AD Password
HashEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); // LDAP工廠類
HashEnv.put(Context.PROVIDER_URL, this.URL);
try {
ctx = new InitialLdapContext(HashEnv, null);
System.out.println("初始化ldap成功!");
} catch (NamingException e) {
e.printStackTrace();
System.err.println("Throw Exception : " + e);
throw e;
}
}
....
}
在外部類中調用這個類的getInstance()方法則可以得到helper對象并初始化好了LdapContext對象
查詢對象屬性
try {
// 域節點
String searchBase = this.getBaseDnForRoleObject("CN=角色1,CN=RoleObjectDemo2,CN=msDS-AzapplicationTest2,CN=Authorization2,CN=Program Data Test,DC=cayzlh,DC=com"); // LDAP搜索過濾器類
String searchFilter = "(cn=*)";
// 創建搜索控制器
SearchControls searchCtls = new SearchControls();
// 設置搜索范圍
searchCtls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
String returnedAtts[] = { "distinguishedName " }; // 定制返回屬性, 這里只需要查詢 角色1 這個對象的 distinguishedName 屬性
searchCtls.setReturningAttributes(returnedAtts); // 設置返回屬性集
// 不設置則返回所有屬性
// 根據設置的域節點、過濾器類和搜索控制器搜索LDAP得到結果
NamingEnumeration<?> answer = ctx.search(searchBase, searchFilter, searchCtls);// Search
while (answer.hasMoreElements()) {// 遍歷結果集
// 得到符合搜索條件的DN
SearchResult sr = (SearchResult) answer.next();
// 得到符合條件的屬性集
Attributes attrs = sr.getAttributes();
if (attrs != null) {
try {
if ( attrs.getAll().hasMore() ) {
Attribute attr = (Attribute) ne.next();// 得到下一個屬性
System.out.println(attr.getAll().next().toString());
// 這里輸出得到的就是 角色1 的distinguishedName 屬性,如果要獲取有多個值的屬性, 則可以利用循環和next()方法來獲取得到這個屬性的所有值
}
} catch (NamingException e) {
e.printStackTrace();
System.err.println("Throw Exception : " + e);
}
}
}
} catch (NamingException e) {
System.err.println("Throw Exception : " + e);
}
工具
在開發過程中使用的工具是 ADSI編輯器在域服務中進行查看和編輯相應的屬性。打開方式如圖所示:

源代碼
寫了一份簡單的demo,是web版的,也許有些問題,稍微改一下就可以了。又需要的可以下載來玩玩。。
下載地址:http://files.VEVb.com/files/chenanyu/LdapTest.zip

好久好久沒有發過博客,不足之處見諒。。