从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) ;
[六一云迎国庆]转盘活动实物礼品美国G口/香港CTG/美国T级超防云/物理机/CDN大促销六一云 成立于2018年,归属于西安六一网络科技有限公司,是一家国内正规持有IDC ISP CDN IRCS电信经营许可证书的老牌商家。大陆持证公司受大陆各部门监管不好用支持退款退现,再也不怕被割韭菜了!主要业务有:国内高防云,美国高防云,美国cera大带宽,香港CTG,香港沙田CN2,海外站群服务,物理机,...
乌云数据主营高性价比国内外云服务器,物理机,本着机器为主服务为辅的运营理念,将客户的体验放在第一位,提供性价比最高的云服务器,帮助各位站长上云,同时我们深知新人站长的不易,特此提供永久免费虚拟主机,已提供两年之久,帮助了上万名站长从零上云官网:https://wuvps.cn迎国庆豪礼一多款机型史上最低价,续费不加价 尽在wuvps.cn香港cera机房,香港沙田机房,超低延迟CN2线路地区CPU...
ZJI是成立于2011年原Wordpress圈知名主机商—维翔主机,2018年9月更名为ZJI,主要提供香港、日本、美国独立服务器(自营/数据中心直营)租用及VDS、虚拟主机空间、域名注册业务。本月商家针对香港阿里云线路独立服务器提供月付立减270-400元优惠码,优惠后香港独立服务器(阿里云专线)E3或者E5 CPU,SSD硬盘,最低每月仅480元起。阿里一型CPU:Intel E5-2630L...