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
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
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
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
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
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
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
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
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.}
发布评论