2023年6月21日发(作者:)

通过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服务地址

_URL = "ldap://localhost:8389";

//管理员账号

ER_DN = "uid=linly,ou=People,dc=jsoso,dc=net";

//管理员密码

ER_PASSWORD = "coffee";

//认证类型

_TYPE = "simple";

//JNDI Context⼯⼚类

XT_FACTORY = "xFactory";

perty(L_CONTEXT_FACTORY, XT_FACTORY);

perty(ER_URL, _URL);

perty(TY_AUTHENTICATION, _TYPE);

perty(TY_PRINCIPAL, ER_DN);

perty(TY_CREDENTIALS, ER_PASSWORD);

/*

* 绑定ldap服务器

*/

= new InitialDirContext(ps);

}

}

通过⼀个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 = ributes(ldapGroupDN);

n("Find the group , attributes list :");

NamingEnumeration nEnum = ();

for( ; e() ; ){

String attrID = ();

Attribute attr = (Attribute)(attrID);

n(ng());

}

return false;

} catch (NamingException e) {

/*

* 没有找到对应的Group条⽬,新增Group条⽬

*/

//创建objectclass属性 Attribute objclass = new BasicAttribute("objectclass");

("top");

("organizationalunit");

//创建cn属性

Attribute cn = new BasicAttribute("ou", "Employee");

//创建Attributes,并添加objectclass和cn属性

Attributes attrs = new BasicAttributes();

(objclass);

(cn);

//将属性绑定到新的条⽬上,创建该条⽬

try {

(ldapGroupDN, null, attrs);

n("Group created successful");

return true;

} catch (NamingException e1) {

tackTrace();

}

}

return false;

}

获取条⽬属性

下⾯⼀段代码获取entryDN参数指定条⽬中的属性集合,并打印到控制台

/**

* 获取⼀个指定的LDAP Entry

* @param entryDN

*/

public void find(String entryDN){

try {

Attributes attrs = ributes(entryDN);

if (attrs != null) {

NamingEnumeration nEnum = ();

for( ; e() ; ){

String attrID = ();

Attribute attr = (Attribute)(attrID);

n(ng());

}

n();

}else{

n("No found binding.");

}

}catch(NamingException ne) {

tackTrace();

}

}

修改条⽬属性

修改DN=tinguishedName()的条⽬中的cn、givenname、sn和userpassword四个属性值。

(注:参数E_ATTRIBUTE有另外两个常量:_ATTRIBUTE;_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 = tinguishedName();

if (userDN == null && () == 0) { throw new NamingException("No userDN you specify!n");

}

//判断⽤户条⽬是否已经存在

if(!isUserexist(userDN)){

return false;

}

//设置属性

Attributes attrs = new BasicAttributes();

setBasicAttribute(attrs, "cn", momName());

setBasicAttribute(attrs, "givenname", stName());

setBasicAttribute(attrs, "sn", tName());

setBasicAttribute(attrs, "userpassword", sword());

//修改属性

try{

Attributes(tinguishedName(),E_ATTRIBUTE, attrs);

n("User(" + tinguishedName() + ") information modified.n");

return true;

}catch(NamingException ne){

tackTrace();

}

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();

rchScope(E_SCOPE);

try {

Name baseName = new LdapName(baseDN);

NamingEnumeration ne = (baseName, matchingAttributes);

SearchResult entry = null;

for(;e();){

entry = ();

showEntry(entry);

}

} catch (NamingException e) {

tackTrace();

}

}

根据过滤器搜索条⽬

根据过滤器条件,在上下⽂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();

rchScope(E_SCOPE);

try {

NamingEnumeration ne = (baseDN, filter , cons);

SearchResult entry = null;

for(;e();){ entry = ();

showEntry(entry);

}

} catch (NamingException e) {

tackTrace();

}

这⾥的内容是抄录别⼈的,⾃⼰写的没有别⼈写的这份全。这⾥的增加⽤户,增加组织单元,查找⽤户都经过了我的验证,没有问题。但是修改我没有验证通过。删除没有做,但是从API上看,是没有问题的。 详细内容可以去百度⽂库搜:LDAP实⽤资料收录 。该例⼦中,我们使⽤uid=linly,ou=People,dc=jsoso,dc=net这个账号,链接位于本机8389端⼝的LDAP服务器(ldap://localhost:8389),认证⽅式采⽤simple类型,即⽤户名/密码⽅式。Java代码1.

private static void initialContext() throws NamingException{

2.

if(singleton == null){

3.

singleton = new LDAPConnection();

4.

/*

5.

* 在实际编码中,这些环境变量应尽可能通过配置⽂件读取

6.

*/

7.

//LDAP服务地址

8.

_URL = "ldap://localhost:8389";

9.

//管理员账号

10. ER_DN = "uid=linly,ou=People,dc=jsoso,dc=net";

11. //管理员密码

12. ER_PASSWORD = "coffee";

13. //认证类型

14. _TYPE = "simple";

15. //JNDI Context⼯⼚类

16. XT_FACTORY = "xFactory";

17.

18. perty(L_CONTEXT_FACTORY, XT_FACTORY);

19. perty(ER_URL, _URL);

20. perty(TY_AUTHENTICATION, _TYPE);

21. perty(TY_PRINCIPAL, ER_DN);

22. perty(TY_CREDENTIALS, ER_PASSWORD);

23. /*

24. * 绑定ldap服务器

25. */

26. = new InitialDirContext(ps); 27. }

28.}

2023年6月21日发(作者:)

通过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服务地址

_URL = "ldap://localhost:8389";

//管理员账号

ER_DN = "uid=linly,ou=People,dc=jsoso,dc=net";

//管理员密码

ER_PASSWORD = "coffee";

//认证类型

_TYPE = "simple";

//JNDI Context⼯⼚类

XT_FACTORY = "xFactory";

perty(L_CONTEXT_FACTORY, XT_FACTORY);

perty(ER_URL, _URL);

perty(TY_AUTHENTICATION, _TYPE);

perty(TY_PRINCIPAL, ER_DN);

perty(TY_CREDENTIALS, ER_PASSWORD);

/*

* 绑定ldap服务器

*/

= new InitialDirContext(ps);

}

}

通过⼀个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 = ributes(ldapGroupDN);

n("Find the group , attributes list :");

NamingEnumeration nEnum = ();

for( ; e() ; ){

String attrID = ();

Attribute attr = (Attribute)(attrID);

n(ng());

}

return false;

} catch (NamingException e) {

/*

* 没有找到对应的Group条⽬,新增Group条⽬

*/

//创建objectclass属性 Attribute objclass = new BasicAttribute("objectclass");

("top");

("organizationalunit");

//创建cn属性

Attribute cn = new BasicAttribute("ou", "Employee");

//创建Attributes,并添加objectclass和cn属性

Attributes attrs = new BasicAttributes();

(objclass);

(cn);

//将属性绑定到新的条⽬上,创建该条⽬

try {

(ldapGroupDN, null, attrs);

n("Group created successful");

return true;

} catch (NamingException e1) {

tackTrace();

}

}

return false;

}

获取条⽬属性

下⾯⼀段代码获取entryDN参数指定条⽬中的属性集合,并打印到控制台

/**

* 获取⼀个指定的LDAP Entry

* @param entryDN

*/

public void find(String entryDN){

try {

Attributes attrs = ributes(entryDN);

if (attrs != null) {

NamingEnumeration nEnum = ();

for( ; e() ; ){

String attrID = ();

Attribute attr = (Attribute)(attrID);

n(ng());

}

n();

}else{

n("No found binding.");

}

}catch(NamingException ne) {

tackTrace();

}

}

修改条⽬属性

修改DN=tinguishedName()的条⽬中的cn、givenname、sn和userpassword四个属性值。

(注:参数E_ATTRIBUTE有另外两个常量:_ATTRIBUTE;_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 = tinguishedName();

if (userDN == null && () == 0) { throw new NamingException("No userDN you specify!n");

}

//判断⽤户条⽬是否已经存在

if(!isUserexist(userDN)){

return false;

}

//设置属性

Attributes attrs = new BasicAttributes();

setBasicAttribute(attrs, "cn", momName());

setBasicAttribute(attrs, "givenname", stName());

setBasicAttribute(attrs, "sn", tName());

setBasicAttribute(attrs, "userpassword", sword());

//修改属性

try{

Attributes(tinguishedName(),E_ATTRIBUTE, attrs);

n("User(" + tinguishedName() + ") information modified.n");

return true;

}catch(NamingException ne){

tackTrace();

}

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();

rchScope(E_SCOPE);

try {

Name baseName = new LdapName(baseDN);

NamingEnumeration ne = (baseName, matchingAttributes);

SearchResult entry = null;

for(;e();){

entry = ();

showEntry(entry);

}

} catch (NamingException e) {

tackTrace();

}

}

根据过滤器搜索条⽬

根据过滤器条件,在上下⽂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();

rchScope(E_SCOPE);

try {

NamingEnumeration ne = (baseDN, filter , cons);

SearchResult entry = null;

for(;e();){ entry = ();

showEntry(entry);

}

} catch (NamingException e) {

tackTrace();

}

这⾥的内容是抄录别⼈的,⾃⼰写的没有别⼈写的这份全。这⾥的增加⽤户,增加组织单元,查找⽤户都经过了我的验证,没有问题。但是修改我没有验证通过。删除没有做,但是从API上看,是没有问题的。 详细内容可以去百度⽂库搜:LDAP实⽤资料收录 。该例⼦中,我们使⽤uid=linly,ou=People,dc=jsoso,dc=net这个账号,链接位于本机8389端⼝的LDAP服务器(ldap://localhost:8389),认证⽅式采⽤simple类型,即⽤户名/密码⽅式。Java代码1.

private static void initialContext() throws NamingException{

2.

if(singleton == null){

3.

singleton = new LDAPConnection();

4.

/*

5.

* 在实际编码中,这些环境变量应尽可能通过配置⽂件读取

6.

*/

7.

//LDAP服务地址

8.

_URL = "ldap://localhost:8389";

9.

//管理员账号

10. ER_DN = "uid=linly,ou=People,dc=jsoso,dc=net";

11. //管理员密码

12. ER_PASSWORD = "coffee";

13. //认证类型

14. _TYPE = "simple";

15. //JNDI Context⼯⼚类

16. XT_FACTORY = "xFactory";

17.

18. perty(L_CONTEXT_FACTORY, XT_FACTORY);

19. perty(ER_URL, _URL);

20. perty(TY_AUTHENTICATION, _TYPE);

21. perty(TY_PRINCIPAL, ER_DN);

22. perty(TY_CREDENTIALS, ER_PASSWORD);

23. /*

24. * 绑定ldap服务器

25. */

26. = new InitialDirContext(ps); 27. }

28.}