从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) ;
diyvm怎么样?diyvm商家VPS主机均2GB内存起步,三个地区机房可选,使用优惠码后每月69元起;DiyVM独立服务器开设在香港沙田电信机房,CN2线路,5M带宽,自动化开通上架,最低499元/月,配置是L5630*2/16G内存/120G SSD硬盘。DiyVM是一家成立于2009年的国人主机商,提供的产品包括VPS主机、独立服务器租用等,产品数据中心包括中国香港、日本大阪和美国洛杉矶等,...
wordpress高级跨屏企业主题,通用响应式跨平台站点开发,自适应PC端+各移动端屏幕设备,高级可视化自定义设置模块+高效的企业站搜索优化。wordpress绿色企业自适应主题采用标准的HTML5+CSS3语言开发,兼容当下的各种主流浏览器: IE 6+(以及类似360、遨游等基于IE内核的)、Firefox、Google Chrome、Safari、Opera等;同时支持移动终端的常用浏览器应...
触摸云触摸云(cmzi.com),国人商家,有IDC/ISP正规资质,主营香港线路VPS、物理机等产品。本次为大家带上的是美国高防2区的套餐。去程普通线路,回程cn2 gia,均衡防御速度与防御,防御值为200G,无视UDP攻击,可选择性是否开启CC防御策略,超过峰值黑洞1-2小时。最低套餐20M起,多数套餐为50M,适合有防御型建站需求使用。美国高防2区 弹性云[大宽带]· 配置:1-16核· ...