Sun Directory ServerLDAP学习笔记(二)——API说明及代码样例.doc_第1页
Sun Directory ServerLDAP学习笔记(二)——API说明及代码样例.doc_第2页
Sun Directory ServerLDAP学习笔记(二)——API说明及代码样例.doc_第3页
Sun Directory ServerLDAP学习笔记(二)——API说明及代码样例.doc_第4页
Sun Directory ServerLDAP学习笔记(二)——API说明及代码样例.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

从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, Object obj, Attributes attrs) bind(String name, Object obj, Attributes attrs) createSubcontext(Name name, Attributes attrs) createSubcontext(String name, Attributes attrs) 获取条目实例(属性集) getAttributes(Name name) getAttributes(Name name, String attrIds) getAttributes(String name) getAttributes(String name, String attrIds) 修改条目属性 modifyAttributes(Name name, int mod_op, Attributes attrs) modifyAttributes(Name name, ModificationItem mods) modifyAttributes(String name, int mod_op, Attributes attrs) modifyAttributes(String name, ModificationItem mods) u 删除条目 destroySubcontext(Name name) destroySubcontext(String name) 根据属性集搜索条目 search(Name name, Attributes matchingAttributes) search(Name name, Attributes matchingAttributes, String attributesToReturn) search(String name, Attributes matchingAttributes) search(String name, Attributes matchingAttributes, String attributesToReturn) u 根据过滤器搜索条目 search(Name name, String filterExpr, Object filterArgs, SearchControls cons) search(Name name, String filter, SearchControls cons) search(String name, String filterExpr, Object filterArgs, SearchControls cons) search(String name, String filter, SearchControls cons) javax.naming.directory.BasicAttribute,LDAP基本属性对象 该类用来表示LDAP条目中的单个属性对象。在目录服务中,每个属性名称是可以对应多个的属性值的。 构建属性对象 BasicAttribute(String id) BasicAttribute(String id, boolean ordered) BasicAttribute(String id, Object value) BasicAttribute(String id, Object value, boolean ordered) 添加属性值 add(int ix, Object attrVal),添加属性值到多值属性的指定位置 add(Object attrVal) , 追加属性值到多值属性尾部 判断属性值是否包含 contains(Object attrVal) , 多值属性中有一个值是匹配的,返回true 获取属性值 get(),取得属性值中的一个 get(int ix),从多值属性中的指定位置取值 获取属性ID getID(),属性的ID就是属性名 删除属性值 remove(int ix),删除指定位置的属性值 remove(Object attrval),删除指定的属性值 javax.naming.directory.BasicAttributes,LDAP实体的属性集 该类表示一个LDAP条目绑定的属性集合,在绝大多数情况下,一个LDAP条目存在多个属性。 构造属性集 BasicAttributes() BasicAttributes(boolean ignoreCase),属性ID是否大小写敏感,建议不要使用敏感 BasicAttributes(String attrID, Object val) BasicAttributes(String attrID, Object val, boolean ignoreCase) 获取属性集中的单个属性对象 get(String attrID) 获取全部属性的枚举 getAll() 获取全部属性的ID枚举 getIDs() u 添加新属性 put(Attribute attr) put(String attrID, Object val) u 移除指定属性 remove(String attrID) javax.naming.directory.SearchControls , LDAP目录服务搜索控制对象 该类负责控制LDAP搜索行为的范围、设定返回结果数上限,搜索耗时上限,指定结果所包括的属性集等。 设定搜索行为的范围 setSearchScope(int scope) u 设定返回结果数上限 setCountLimit(long limit) u 设定搜索耗时上限 setTimeLimit(int ms) , 以毫秒为单位 u 指定结果所包括的属性集 setReturningAttributes(String attrs) javax.naming.directory.SearchResult , 表示.search() 方法的返回结果集中的一项。 SearchResult类是对LDAP条目属性集的封装。在search()操作中可能返回完整的条目属性,也可能是条目属性的一部分。 获取SearchResult封装的条目属性 getAttributes() 以上只列举了LDAP操作API的常用部分,更多更详细的描述,请参考 Sun Java6.0 API DOC。 LDAP操作代码样例 在这个章节中,我们将结合LDAP操作的代码实例了解API使用。 初始化LDAP 目录服务上下文 该例子中,我们使用uid=linly,ou=People,dc=jsoso,dc=net这个账号,链接位于本机8389端口的LDAP服务器(ldap:/localhost:8389),认证方式采用simple类型,即用户名/密码方式。 Java代码 1. privatestaticvoidinitialContext()throwsNamingException 2. if(singleton=null) 3. singleton=newLDAPConnection(); 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. /JNDIContext工厂类 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=newInitialDirContext(singleton.envProps); 27. 28. private static void initialContext() throws NamingExceptionif(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条目如下: Java代码 1. publicbooleancreateOrganizationUnit() 2. StringldapGroupDN=ou=Employee,dc=jsoso,dc=net; 3. try 4. /* 5. *查找是否已经存在指定的OU条目 6. *如果存在,则打印OU条目的属性信息 7. *如果不存在,则程序会抛出NamingException异常,进入异常处理 8. */9. Attributesattrs=dirContext.getAttributes(ldapGroupDN); 10. System.out.println(Findthegroup,attributeslist:); 11. NamingEnumerationnEnum=attrs.getIDs(); 12. for(;nEnum.hasMore();) 13. StringattrID=nEnum.next(); 14. Attributeattr=(Attribute)attrs.get(attrID); 15. System.out.println(attr.toString(); 16. 17. returnfalse; 18. catch(NamingExceptione) 19. /* 20. *没有找到对应的Group条目,新增Group条目 21. */22. /创建objectclass属性 23. Attributeobjclass=newBasicAttribute(objectclass); 24. objclass.add(top); 25. objclass.add(organizationalunit); 26. /创建cn属性 27. Attributecn=newBasicAttribute(ou,Employee); 28. /创建Attributes,并添加objectclass和cn属性 29. Attributesattrs=newBasicAttributes(); 30. attrs.put(objclass); 31. attrs.put(cn); 32. /将属性绑定到新的条目上,创建该条目 33. try 34. dirContext.bind(ldapGroupDN,null,attrs); 35. System.out.println(Groupcreatedsuccessful); 36. returntrue; 37. catch(NamingExceptione1) 38. e1.printStackTrace(); 39. 40. 41. returnfalse; 42. 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 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;或者使用createSubcontext方法创建亦可,以下例子我们新增一个inetorgperson类的LDAP条目: Java代码 1. /* 2. *创建LDAP用户条目 3. *paramuser 4. *return 5. */6. publicbooleancreateUser(LDAPUseruser) 7. if(user=null) 8. returnfalse; 9. 10. 11. if(user.getUserID()=null|user.getUserID().length()=0 12. |user.getFirstName()=null|user.getFirstName().length()=013. |user.getLastName()=null|user.getLastName().length()=014. |user.getCommomName()=null|user.getCommomName().length()=0) 15. returnfalse; 16. 17. 18. /判断用户条目是否已经存在 19. if(isUserexist(user.getDistinguishedName() 20. returntrue; 21. 22. 23. /* 24. *新建条目属性集 25. */26. Attributesattrs=newBasicAttributes(); 27. setBasicAttribute(attrs,objectclass,top,person,organizationalPerson,inetorgperson); 28. setBasicAttribute(attrs,cn,user.getCommomName(); 29. setBasicAttribute(attrs,givenname,user.getFirstName(); 30. setBasicAttribute(attrs,sn,user.getLastName(); 31. setBasicAttribute(attrs,uid,user.getUserID(); 32. setBasicAttribute(attrs,userpassword,user.getPassword(); 33. 34. /添加用户条目节点 35. try 36. dirContext.createSubcontext(user.getDistinguishedName(),attrs); 37. System.out.println(AddUser(+user.getDistinguishedName()+)ok.); 38. returntrue; 39. catch(NamingExceptione) 40. e.printStackTrace(); 41. 42. returnfalse; 43. /* * 创建LDAP用户条目 * param user * return */public boolean createUser(LDAPUser user)if(user = null)return false;if(user.getUserID() = null | user.getUserID().length() = 0 | user.getFirstName() = null | user.getFirstName().length() = 0| user.getLastName() = null | user.getLastName().length() = 0| user.getCommomName() = null | user.getCommomName().length() = 0)return false;/判断用户条目是否已经存在if(isUserexist(user.getDistinguishedName()return true;/* * 新建条目属性集 */Attributes attrs = new BasicAttributes(); setBasicAttribute(attrs , objectclass , top,person,organizationalPerson,inetorgperson);setBasicAttribute(attrs , cn , user.getCommomName();setBasicAttribute(attrs , givenname , user.getFirstName();setBasicAttribute(attrs , sn , user.getLastName();setBasicAttribute(attrs , uid , user.getUserID();setBasicAttribute(attrs , userpassword , user.getPassword();/添加用户条目节点 try dirContext.createSubcontext(user.getDistinguishedName(), attrs);System.out.println(Add User( + user.getDistinguishedName() + ) ok.); return true; catch (NamingException e) e.printStackTrace(); return false;获取条目属性 下面一段代码获取entryDN参数指定条目中的属性集合,并打印到控制台 Java代码 1. /* 2. *获取一个指定的LDAPEntry 3. *paramentryDN 4. */5. publicvoidfind(StringentryDN) 6. try 7. Attributesattrs=dirContext.getAttributes(entryDN); 8. if(attrs!=null) 9. NamingEnumerationnEnum=attrs.getIDs(); 10. for(;nEnum.hasMore();) 11. StringattrID=nEnum.next(); 12. Attributeattr=(Attribute)attrs.get(attrID); 13. System.out.println(attr.toString(); 14. 15. System.out.println(); 16. else 17. System.out.println(Nofoundbinding.); 18. 19. catch(NamingExceptionne) 20. ne.printStackTrace(); 21. 22. /* * 获取一个指定的LDAP Entry * param entryDN */public void find(String entryDN)try Attributes attrs = dirContext.getAttributes(entryDN); if (attrs != null) NamingEnumeration 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,分别表示新增属性和删除属性。) Java代码 1. /* 2. *修改用户信息 3. *paramuser 4. *return 5. *throwsException 6. */ 7. publicbooleanmodifyUser(LDAPUseruser)throwsException 8. /用户对象为空 9. if(user=null) 10. thrownewException(Nouserinformation!n); 11. 12. 13. /检查uid 14. StringuserDN=user.getDistinguishedName(); 15. if(userDN=null&userDN.length()=0) 16. thrownewNamingException(NouserDNyouspecify!n); 17. 18. 19. /判断用户条目是否已经存在 20. if(!isUserexist(userDN) 21. returnfalse; 22. 23. 24. /设置属性 25. Attributesattrs=newBasicAttributes(); 26. setBasicAttribute(attrs,cn,user.getCommomName(); 27. setBasicAttribute(attrs,givenname,user.getFirstName(); 28. setBasicAttribute(attrs,sn,user.getLastName(); 29. setBasicAttribute(attrs,userpassword,user.getPassword(); 30. /修改属性 31. try 32. dirContext.modifyAttributes(user.getDistinguishedName(),DirContext.REPLACE_ATTRIBUTE,attrs); 33. System.out.println(User(+user.getDistinguishedName()+)informationmodified.n); 34. returntrue; 35. catch(NamingExceptionne) 36. ne.printStackTrace(); 37. 38. returnfalse; 39. /* * 修改用户信息 * 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(); /修改属性 trydirContext.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;删除条目 删除DN= userDN条目 Java代码 1. /* 2. *删除用户 3. *paramuserDN 4. *return 5. */6. publicbooleandeleteUser(StringuserDN) 7. if(!isUserexist(userDN) 8. returntrue; 9. 10. try 11. dirContext.destroySubcontext(userDN); 12. System.out.println(User(+userDN+)deleted.n); 13. returntrue; 14. catch(NamingExceptione) 15. e.printStackTrace(); 16. 17. returnfalse; 18. /* * 删除用户 * param userDN * return */public boolean deleteUser(String userDN) if(!isUserexist(userDN) return true; try dirContext.destroySubcontext(userDN);System.out.println(User( + userDN + ) deleted.n); return true; catch (NamingException e) e.printStackTrace(); return false;根据属性集搜索条目 根据属性集matchingAttributes中的匹配值,在上下文DN= ou=People,dc=jsoso ,dc=net中搜索它的所有子树中的匹配条目。 (注:SearchControls的SCOPE参数详见SearchControls SCOPE补充说明) Java代码 1. /* 2. *通过属性搜索LDAP范例 3. *return 4. */5. publicvoidsearchByAttribute(AttributesmatchingAttributes) 6. StringbaseDN=ou=People,dc=jsoso,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论