Sun Directory ServerLDAP学习笔记二API说明及代码样例.docx
- 文档编号:7265858
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:24
- 大小:192.62KB
Sun Directory ServerLDAP学习笔记二API说明及代码样例.docx
《Sun Directory ServerLDAP学习笔记二API说明及代码样例.docx》由会员分享,可在线阅读,更多相关《Sun Directory ServerLDAP学习笔记二API说明及代码样例.docx(24页珍藏版)》请在冰豆网上搜索。
SunDirectoryServerLDAP学习笔记二API说明及代码样例
从JDK5.0开始,对LDAP协议的数据访问操作就被集成在javax的扩展API包中,并随同JDK一并发布,这一章节,我们主要介绍API包中的类信息。
javax.naming.directory包的结构
常用API解析
javax.naming.directory.InitialDirContext,初始化目录服务上下文类
该类是LDAP数据内容的操作工具类,通过该类可以执行绑定LDAP服务器、新增LDAP条目、获取条目实例、修改条目属性、删除条目和根据条件搜索条目等操作。
常用方法说明如下:
初始化LDAP目录服务上下文(相当于使用JDBC打开一个数据库链接)
∙InitialDirContext(Hashtable
?
>environment)
绑定/创建LDAP条目对象(相当于新增一个LDAP条目数据bind(Name
∙name,Objectobj,Attributesattrs)
∙bind(Stringname,Objectobj,Attributesattrs)
∙createSubcontext(Namename,Attributesattrs)
∙createSubcontext(Stringname,Attributesattrs)
获取条目实例(属性集)
∙getAttributes(Namename)
∙getAttributes(Namename,String[]attrIds)
∙getAttributes(Stringname)
∙getAttributes(Stringname,String[]attrIds)
修改条目属性
∙modifyAttributes(Namename,intmod_op,Attributesattrs)
∙modifyAttributes(Namename,ModificationItem[]mods)
∙modifyAttributes(Stringname,intmod_op,Attributesattrs)
∙modifyAttributes(Stringname,ModificationItem[]mods)
删除条目
∙destroySubcontext(Namename)
∙destroySubcontext(Stringname)
根据属性集搜索条目
∙search(Namename,AttributesmatchingAttributes)
∙search(Namename,AttributesmatchingAttributes,String[]attributesToReturn)
∙search(Stringname,AttributesmatchingAttributes)
∙search(Stringname,AttributesmatchingAttributes,String[]attributesToReturn)
根据过滤器搜索条目
∙search(Namename,StringfilterExpr,Object[]filterArgs,SearchControlscons)
∙search(Namename,Stringfilter,SearchControlscons)
∙search(Stringname,StringfilterExpr,Object[]filterArgs,SearchControlscons)
∙search(Stringname,Stringfilter,SearchControlscons)
javax.naming.directory.BasicAttribute,LDAP基本属性对象
该类用来表示LDAP条目中的单个属性对象。
在目录服务中,每个属性名称是可以对应多个的属性值的。
构建属性对象
∙BasicAttribute(Stringid)
∙BasicAttribute(Stringid,booleanordered)
∙BasicAttribute(Stringid,Objectvalue)
∙BasicAttribute(Stringid,Objectvalue,booleanordered)
添加属性值
∙add(intix,ObjectattrVal),添加属性值到多值属性的指定位置
∙add(ObjectattrVal),追加属性值到多值属性尾部
判断属性值是否包含
∙contains(ObjectattrVal),多值属性中有一个值是匹配的,返回true
获取属性值
∙get(),取得属性值中的一个
∙get(intix),从多值属性中的指定位置取值
获取属性ID
∙getID(),属性的ID就是属性名
删除属性值
∙remove(intix),删除指定位置的属性值
∙remove(Objectattrval),删除指定的属性值
javax.naming.directory.BasicAttributes,LDAP实体的属性集
该类表示一个LDAP条目绑定的属性集合,在绝大多数情况下,一个LDAP条目存在多个属性。
构造属性集
∙BasicAttributes()
∙BasicAttributes(booleanignoreCase),属性ID是否大小写敏感,建议不要使用敏感
∙BasicAttributes(StringattrID,Objectval)
∙BasicAttributes(StringattrID,Objectval,booleanignoreCase)
获取属性集中的单个属性对象
∙get(StringattrID)
获取全部属性的枚举
∙getAll()
获取全部属性的ID枚举
∙getIDs()
添加新属性
∙put(Attributeattr)
∙put(StringattrID,Objectval)
移除指定属性
∙remove(StringattrID)
javax.naming.directory.SearchControls,LDAP目录服务搜索控制对象
该类负责控制LDAP搜索行为的范围、设定返回结果数上限,搜索耗时上限,指定结果所包括的属性集等。
设定搜索行为的范围
∙setSearchScope(intscope)
设定返回结果数上限
∙setCountLimit(longlimit)
设定搜索耗时上限
∙setTimeLimit(intms),以毫秒为单位
指定结果所包括的属性集
∙setReturningAttributes(String[]attrs)
javax.naming.directory.SearchResult,表示.search()方法的返回结果集中的一项。
SearchResult类是对LDAP条目属性集的封装。
在search()操作中可能返回完整的条目属性,也可能是条目属性的一部分。
获取SearchResult封装的条目属性
∙getAttributes()
以上只列举了LDAP操作API的常用部分,更多更详细的描述,请参考SunJava6.0APIDOC。
LDAP操作代码样例
在这个章节中,我们将结合LDAP操作的代码实例了解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. singleton.sLDAP_URL = "ldap:
//localhost:
8389";
9. //管理员账号
10. singleton.sMANAGER_DN = "uid=linly,ou=People,dc=jsoso,dc=net";
11. //管理员密码
12. singleton.sMANAGER_PASSWORD = "coffee";
13. //认证类型
14. singleton.sAUTH_TYPE = "simple";
15. //JNDI Context工厂类
16. singleton.sCONTEXT_FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";
17.
18. singleton.envProps.setProperty(Context.INITIAL_CONTEXT_FACTORY, singleton.sCONTEXT_FACTORY);
19. singleton.envProps.setProperty(Context.PROVIDER_URL, singleton.sLDAP_URL);
20. singleton.envProps.setProperty(Context.SECURITY_AUTHENTICATION, singleton.sAUTH_TYPE);
21. singleton.envProps.setProperty(Context.SECURITY_PRINCIPAL, singleton.sMANAGER_DN);
22. singleton.envProps.setProperty(Context.SECURITY_CREDENTIALS, singleton.sMANAGER_PASSWORD);
23. /*
24. * 绑定ldap服务器
25. */
26. singleton.dirCtx = new InitialDirContext(singleton.envProps);
27. }
28.}
privatestaticvoidinitialContext()throwsNamingException{
if(singleton==null){
singleton=newLDAPConnection();
/*
*在实际编码中,这些环境变量应尽可能通过配置文件读取
*/
//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";
//JNDIContext工厂类
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=newInitialDirContext(singleton.envProps);
}
}
通过一个Hashtable或者Properties对象为LDAP的Context设置参数,而后初始化InitialDirContext,即可绑定LDAP服务。
这相当于JDBC中获取数据库的Connection对象。
绑定/创建LDAP条目对象
用户可以使用bind方法创建新的LDAP条目,下面的代码创建一个DN:
"ou=Employee,dc=jsoso,dc=net"的OrganizationUnit类LDAP条目如下:
Java代码
1.public boolean createOrganizationUnit(){
2. String ldapGroupDN = "ou=Employee , dc=jsoso ,dc=net";
3. try {
4. /*
5. * 查找是否已经存在指定的OU条目
6. * 如果存在,则打印OU条目的属性信息
7. * 如果不存在,则程序会抛出NamingException异常,进入异常处理
8. */
9. Attributes attrs = dirContext.getAttributes(ldapGroupDN);
10. System.out.println("Find the group , attributes list :
");
11. NamingEnumeration
12. for( ; nEnum.hasMore() ; ){
13. String attrID = nEnum.next();
14. Attribute attr = (Attribute)attrs.get(attrID);
15. System.out.println(attr.toString());
16. }
17. return false;
18. } catch (NamingException e) {
19. /*
20. * 没有找到对应的Group条目,新增Group条目
21. */
22. //创建objectclass属性
23. Attribute objclass = new BasicAttribute("objectclass");
24. objclass.add("top");
25. objclass.add("organizationalunit");
26. //创建cn属性
27. Attribute cn = new BasicAttribute("ou", "Employee");
28. //创建Attributes,并添加objectclass和cn属性
29. Attributes attrs = new BasicAttributes();
30. attrs.put(objclass);
31. attrs.put(cn);
32. //将属性绑定到新的条目上,创建该条目
33. try {
34. dirContext.bind(ldapGroupDN, null, attrs);
35. System.out.println("Group created successful");
36. return true;
37. } catch (NamingException e1) {
38. e1.printStackTrace();
39. }
40. }
41. return false;
42.}
publicbooleancreateOrganizationUnit(){
StringldapGroupDN="ou=Employee,dc=jsoso,dc=net";
try{
/*
*查找是否已经存在指定的OU条目
*如果存在,则打印OU条目的属性信息
*如果不存在,则程序会抛出NamingException异常,进入异常处理
*/
Attributesattrs=dirContext.getAttributes(ldapGroupDN);
System.out.println("Findthegroup,attributeslist:
");
NamingEnumeration
for(;nEnum.hasMore();){
StringattrID=nEnum.next();
Attributeattr=(Attribute)attrs.get(attrID);
System.out.println(attr.toString());
}
returnfalse;
}catch(NamingExceptione){
/*
*没有找到对应的Group条目,新增Group条目
*/
//创建objectclass属性
Attributeobjclass=newBasicAttribute("objectclass");
objclass.add("top");
objclass.add("organizationalunit");
//创建cn属性
Attributecn=newBasicAttribute("ou","Employee");
//创建Attributes,并添加objectclass和cn属性
Attributesattrs=newBasicAttributes();
attrs.put(objclass);
attrs.put(cn);
//将属性绑定到新的条目上,创建该条目
try{
dirContext.bind(ldapGroupDN,null,attrs);
System.out.println("Groupcreatedsuccessful");
returntrue;
}catch(NamingExceptione1){
e1.printStackTrace();
}
}
returnfalse;
}
或者使用createSubcontext方法创建亦可,以下例子我们新增一个inetorgperson类的LDAP条目:
Java代码
1./**
2. * 创建LDAP用户条目
3. * @param user
4. * @return
5. */
6.public boolean createUser(LDAPUser user){
7. if(user == null){
8. return false;
9. }
10.
11. if(user.getUserID() == null || user.getUserID().length() == 0
12. || user.getFirstName() == null || user.getFirstName().length() == 0
13. || user.getLastName() == null || user.getLastName().length() == 0
14. || user.getCommomName() == null || user.getCommomName().length() == 0){
15. return fals
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Sun Directory ServerLDAP学习笔记二API说明及代码样例 ServerLDAP 学习 笔记 API 说明 代码