从JDK5.0开始对LDAP协议的数据访问操作就被集成在javax的扩展API包中并随同JDK一并发布这一章节我们主要介绍API包中的类信息。javax.naming.directory包的结构
常用AP I解析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)
删除条目
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)
根据过滤器搜索条目
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()
添加新属性
put(Attribute attr)
put(String attrID, Object val)
移除指定属性
remove(String attrID)javax.naming.directory.SearchControls , LDAP目录服务搜索控制对象该类负责控制LDAP搜索行为的范围、设定返回结果数上限搜索耗时上限指定结果所包括的属性集等。
设定搜索行为的范围
setSearchScope(int scope)
设定返回结果数上限
setCountLimit(long limit)
设定搜索耗时上限
setTimeLimit(int ms) 以毫秒为单位
指定结果所包括的属性集
setReturningAttributes(String[] attrs)javax.naming.directory.SearchResult 表示. search()方法的返回结果集中的一项。
SearchResult类是对LDAP条目属性集的封装。在search()操作中可能返回完整的条目属性也可能是条目属性的一部分。
获取SearchResult封装的条目属性
getAttributes()
以上只列举了LDAP操作API的常用部分更多更详细的描述请参考SunJava6.0 API DOC。
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. s ingleton. 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, s ingl eton. sMANAGER_DN) ;
22. singleton.envProps. setProperty(Context.SECURITY_CREDENTIALS, s ingleton. sMANAGER_PASSWORD) ;
23. /*
24. *绑定ldap服务器
25. */
26. singleton.dirCtx = new InitialDirContext(singleton. envProps) ;
27. }
28. }
通过一个Hashtable或者Properties对象为LDAP的Context设置参数而后初始化InitialDirContext即可绑定LDAP服务。这相当于JDBC中获取数据库的Connection对象。
绑定/创建LDAP条目对象
用户可以使用b ind方法创建新的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<String> nEnum = attrs.getIDs() ;
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. }
或者使用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() == nul l | | user.getCommomName() . length() == 0) {
15. return false;
16. }
17.
18. //判断用户条目是否已经存在
19. if(isUserexist(user.getDistinguishedName() ) ) {
20. return true;
21. }
22.
23. /*
24. *新建条目属性集
25. */
26. Attributes attrs = new BasicAttributes() ;
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("Add User(" + user.getDistinguishedName() + ") ok. ") ;
38. return true;
39. } catch (NamingException e) {
40. e.printStackTrace() ;
41. }
42. return false;
43. }
获取条目属性
下面一段代码获取entryDN参数指定条目中的属性集合并打印到控制台Java代码
1. /**
2. *获取一个指定的LDAP Entry
3. * @param entryDN
4. */
5. public void find(String entryDN) {
6. try {
7. Attributes attrs = dirContext.getAttributes(entryDN) ;
8. if (attrs != null) {
9. NamingEnumeration<String> nEnum = attrs.getIDs() ;
10. for( ; nEnum.hasMore() ; ) {
11. String attrID = nEnum.next() ;
12. Attribute attr = (Attribute)attrs.get(attrID) ;
ThomasHost域名注册自2012年,部落最早分享始于2016年,还算成立了有几年了,商家提供基于KVM架构的VPS,数据中心包括美国、法国、英国、加拿大和爱尔兰等6个地区机房,VPS主机套餐最低2GB内存起步,支持Windows或者Linux操作系统,1Gbps端口不限制流量。最近商家提供了一个5折优惠码,优惠后最低套餐月付5美元起。下面列出部分套餐配置信息。CPU:1core内存:2GB硬...
快云科技: 11.11钜惠 美国云机2H5G年付148仅有40台,云服务器全场7折,香港云服务器年付388仅不到五折 公司介绍:快云科技是成立于2020年的新进主机商,持有IDC/ICP/ISP等证件资质齐全主营产品有:香港弹性云服务器,美国vps和日本vps,香港物理机,国内高防物理机以及美国日本高防物理机官网地址:www.345idc.com活动截止日期为2021年11月13日此次促销活动提供...
百驰云成立于2017年,是一家新国人IDC商家,且正规持证IDC/ISP/CDN,商家主要提供数据中心基础服务、互联网业务解决方案,及专属服务器租用、云服务器、云虚拟主机、专属服务器托管、带宽租用等产品和服务。百驰云提供源自大陆、香港、韩国和美国等地骨干级机房优质资源,包括BGP国际多线网络,CN2点对点直连带宽以及国际顶尖品牌硬件。专注为个人开发者用户,中小型,大型企业用户提供一站式核心网络云端...