通過LDAP在AD域控上進行新增、刪除、修改、查詢等各種操作
阿新 • • 發佈:2019-02-02
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();
}
該例子中,我們使用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();
}