从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) ;
pacificrack怎么样?pacificrack商家发布了七月最新优惠VPS云服务器计划方案,推出新款优惠便宜VPS云服务器采用的是国产魔方管理系统,也就是PR-M系列,全系基于KVM虚拟架构,这次支持Windows server 2003、2008R2、2012R2、2016、2019、Windows 7、Windows 10以及Linux等操作系统,最低配置为1核心2G内存1Gbps带宽1...
最近发现一个比较怪异的事情,在访问和登录大部分国外主机商和域名商的时候都需要二次验证。常见的就是需要我们勾选判断是不是真人。以及比如在刚才要访问Namecheap检查前几天送给网友域名的账户域名是否转出的,再次登录网站的时候又需要人机验证。这里有看到"Attention Required"的提示。我们只能手工选择按钮,然后根据验证码进行选择合适的标记。这次我要选择的是船的标识,每次需要选择三个,一...
vinahost怎么样?vinahost是一家越南的主机商家,至今已经成13年了,企业运营,老牌商家,销售VPS、虚拟主机、域名、邮箱、独立服务器等,机房全部在越南,有Viettle和VNPT两个机房,其中VNPT机房中三网直连国内的机房,他家的产品优势就是100Mbps不限流量。目前,VinaHost商家发布了新的优惠,购买虚拟主机、邮箱、云服务器、VPS超过三个月都有赠送相应的时长,最高送半年...