JAVAOpenLDAP使用心得.docx
《JAVAOpenLDAP使用心得.docx》由会员分享,可在线阅读,更多相关《JAVAOpenLDAP使用心得.docx(11页珍藏版)》请在咨信网上搜索。
http://njc JAVA,OpenLDAP使用心得 如何安装已经在官方文档有了,一步步的照着做就可以 /usr/local/etc/openldap/slapd.conf中可以找到schema,pid以及数据库文件存放的路径 我修改了/usr/local/etc/openldap/slapd.conf文件,但是发现没啥用,原来是忘了把slapd停止重新启动了。关于停止slapd,官方给的是:kill -INT 'cat /usr/local/var/slapd.pid' 但是我执行以后提示bash: kill: cat /usr/local/var/slapd.pid: arguments must be process or job IDs 用find /usr -name slapd.pid命令找到了在/usr/local/var/run/下,把命令改为: kill -INT `cat /usr/local/var/run/slapd.pid` 重新运行slapd:su root -c /usr/local/libexec/slapd 建议执行/usr/local/libexec/slapd -d256 命令,这样既可以在命令行看到出错信息,也可以用Ctrl+C停止进程 关于rootpw,很多地方都说rootpw和密码值之间不能加空格,不然会出错。有个解决的办法:rootpw "secret" 加了双引号,只要输入的密码和引号里面的对应就可以了。 很多人在测试ldapadd命令时,都遇到过ldap_bind: Invalid credentials(49)错误,看看rootdn "cn=Manager,dc=example,dc=com"和自己的ldif里面的dn参数是不是匹配,如果不匹配就需要修改,修改后记得要停止重启哦(我还不知道怎么重新读取配置的方法,只能用这种笨方法了) 折腾了一天,终于初步了解JAVA怎么在OpenLDAP增加删除数据了。代码如下 /** * * @author chenyi */ import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingException; import javax.naming.directory.*; import java.util.*; public class ChenYi { DirContext ctx = null; String account = "Manager";//操作LDAP的帐户。默认就是Manager。 String password = "secret";//帐户Manager的密码。 String root = "dc=example,dc=com"; //LDAP的根节点的DC public ChenYi() { init(); add(); //delete(); close(); } public void init() { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://192.168.100.221:389/"); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "cn=" + account + "," + root); env.put(Context.SECURITY_CREDENTIALS, password); try { ctx = new InitialDirContext(env);//初始化上下文 System.out.println("认证成功");//这里可以改成异常抛出。 } catch (javax.naming.AuthenticationException e) { System.out.println("认证失败"); } catch (Exception e) { System.out.println("认证出错:" + e); } } public void add() { try { String newUserName = "hi"; BasicAttributes attrs = new BasicAttributes(); BasicAttribute objclassSet = new BasicAttribute("objectClass"); objclassSet.add("top"); objclassSet.add("organizationalUnit"); attrs.put(objclassSet); attrs.put("ou", newUserName); ctx.createSubcontext("ou=" + newUserName + "," + root, attrs); } catch (Exception e) { e.printStackTrace(); System.out.println("Exception in add():" + e); } } public void delete() { try { ctx.destroySubcontext("ou=hi,dc=example,dc=com"); } catch (Exception e) { e.printStackTrace(); System.out.println("Exception in delete():" + e); } } public void close() { if (ctx != null) { try { ctx.close(); } catch (NamingException e) { System.out.println("NamingException in close():" + e); } } } public static void main(String[] args) { new ChenYi(); } } 红线标记的地方特别注意,我看很多文章中写的都类似于env.put(Context.PROVIDER_URL, "ldap://localhost:7001/" + root); 经过我一天的折腾发现加上了root,会报javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Object];错误 。也许这是新版不兼容旧版程序吧 今天终于把添加,删除,修改节点名,属性,遍历节点都弄出来了,先把代码贴出来吧 /** * * @author chenyi */ import java.util.Hashtable; import javax.naming.directory.*; import java.util.*; import javax.naming.*; public class ChenYi { DirContext dc = null; String account = "Manager";//操作LDAP的帐户。默认就是Manager。 String password = "secret";//帐户Manager的密码。 String root = "dc=example,dc=com"; //LDAP的根节点的DC public ChenYi() { init(); //add();//添加节点 //delete("ou=hi,dc=example,dc=com");//删除"ou=hi,dc=example,dc=com"节点 //modifyInformation("ou=hi,dc=example,dc=com");//修改"ou=hi,dc=example,dc=com"属性 //renameEntry("ou=new,o=neworganization,dc=example,dc=com","ou=neworganizationalUnit,o=neworganization,dc=example,dc=com");//重命名节点"ou=new,o=neworganization,dc=example,dc=com" searchInformation("dc=example,dc=com", "", "(objectclass=*)");//遍历所有根节点 //searchInformation("o=neworganization,dc=example,dc=com","","(objectclass=*)");//遍历指定节点的分节点 close(); } public void init() { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://192.168.100.221:389/"); env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "cn=" + account + "," + root); env.put(Context.SECURITY_CREDENTIALS, password); try { dc = new InitialDirContext(env);//初始化上下文 System.out.println("认证成功");//这里可以改成异常抛出。 } catch (javax.naming.AuthenticationException e) { System.out.println("认证失败"); } catch (Exception e) { System.out.println("认证出错:" + e); } } public void close() { if (dc != null) { try { dc.close(); } catch (NamingException e) { System.out.println("NamingException in close():" + e); } } } public void add() { try { String newUserName = "hi"; BasicAttributes attrs = new BasicAttributes(); BasicAttribute objclassSet = new BasicAttribute("objectClass"); objclassSet.add("top"); objclassSet.add("organizationalUnit"); attrs.put(objclassSet); attrs.put("ou", newUserName); dc.createSubcontext("ou=" + newUserName + "," + root, attrs); } catch (Exception e) { e.printStackTrace(); System.out.println("Exception in add():" + e); } } public void delete(String dn) { try { dc.destroySubcontext(dn); } catch (Exception e) { e.printStackTrace(); System.out.println("Exception in delete():" + e); } } public boolean modifyInformation(String dn) { try { ModificationItem[] mods = new ModificationItem[1]; /*添加属性*/ // Attribute attr0 = new BasicAttribute("description", // "测试"); // mods[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE,attr0); /*修改属性*/ // Attribute attr0 = new BasicAttribute("description", "陈轶"); // mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, // attr0); /*删除属性*/ Attribute attr0 = new BasicAttribute("description", "陈轶"); mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, attr0); dc.modifyAttributes(dn, mods); return true; } catch (NamingException ne) { ne.printStackTrace(); System.err.println("Error: " + ne.getMessage()); return false; } } /** * @param base :根节点(在这里是"dc=example,dc=com") * @param scope :搜索范围,分为"base"(本节点),"one"(单层),""(遍历) * @param filter :指定子节点(格式为"(objectclass=*)",*是指全部,你也可以指定某一特定类型的树节点) */ public void searchInformation(String base, String scope, String filter) { SearchControls sc = new SearchControls(); if (scope.equals("base")) { sc.setSearchScope(SearchControls.OBJECT_SCOPE); } else if (scope.equals("one")) { sc.setSearchScope(SearchControls.ONELEVEL_SCOPE); } else { sc.setSearchScope(SearchControls.SUBTREE_SCOPE); } NamingEnumeration ne = null; try { ne = dc.search(base, filter, sc); // Use the NamingEnumeration object to cycle through // the result set. while (ne.hasMore()) { System.out.println(); SearchResult sr = (SearchResult) ne.next(); String name = sr.getName(); if (base != null && !base.equals("")) { System.out.println("entry: " + name + "," + base); } else { System.out.println("entry: " + name); } Attributes at = sr.getAttributes(); NamingEnumeration ane = at.getAll(); while (ane.hasMore()) { Attribute attr = (Attribute) ane.next(); String attrType = attr.getID(); NamingEnumeration values = attr.getAll(); Vector vals = new Vector(); // Another NamingEnumeration object, this time // to iterate through attribute values. while (values.hasMore()) { Object oneVal = values.nextElement(); if (oneVal instanceof String) { System.out.println(attrType + ": " + (String) oneVal); } else { System.out.println(attrType + ": " + new String((byte[]) oneVal)); } } } } } catch (Exception nex) { System.err.println("Error: " + nex.getMessage()); nex.printStackTrace(); } } public boolean renameEntry(String oldDN, String newDN) { try { dc.rename(oldDN, newDN); return true; } catch (NamingException ne) { System.err.println("Error: " + ne.getMessage()); return false; } } public static void main(String[] args) { new ChenYi(); } } 经过几天的努力,把获取objectClass定义和获取Attribute定义的代码弄出来,这样就方便了以后根据自定义schema动态的获取schema中的objectClass和Attribute。特别是对于做添加修改界面应该有点用处,修改了schema并不需要修改代码做代码调整,只需要根据获取的属性个数挨个排好,让别人填入值,并且可以检测MUST的是不是已经填写了。 /** * 获取指定objectClass的定义 * @param name */ public void getObjectClassDefinition(String name) { try { // Get the schema tree root DirContext schema = dc.getSchema(""); // Get the schema object for "person" DirContext personSchema = (DirContext) schema.lookup("ClassDefinition/" + name); Attributes a = personSchema.getAttributes(""); NamingEnumeration ane = a.getAll(); while (ane.hasMore()) { Attribute attr = (Attribute) ane.next(); String attrType = attr.getID(); NamingEnumeration values = attr.getAll(); while (values.hasMore()) { Object oneVal = values.nextElement(); if (oneVal instanceof String) { System.out.println(attrType + ": " + (String) oneVal); } else { System.out.println(attrType + ": " + new String((byte[]) oneVal)); } } } } catch (Exception e) { e.printStackTrace(); } } /** * 获取指定DN的objectClass定义 * @param DN */ public void getDNObjectClassDefinition(String DN) { try { // Get context containing class definitions for the "cn=Ted Geisel" entry DirContext tedClasses = dc.getSchemaClassDefinition(DN); // Enumerate the class definitions NamingEnumeration enum1 = tedClasses.search("", null); while (enum1.hasMore()) { Object o = enum1.next(); System.out.println(((SearchResult) o).getName()); Attributes a = ((SearchResult) o).getAttributes(); NamingEnumeration ane = a.getAll(); while (ane.hasMore()) { Attribute attr = (Attribute) ane.next(); String attrType = attr.getID(); NamingEnumeration values = attr.getAll(); while (values.hasMore()) { Object oneVal = values.nextElement(); if (oneVal instanceof String) { System.out.println(attrType + ": " + (String) oneVal); } else { System.out.println(attrType + ": " + new String((byte[]) oneVal)); } } } } } catch (Exception e) { e.printStackTrace(); } } /** * 获取指定名字的Attribute定义 * @param name */ public void getAttributeDefinition(String name) { try { // Get the schema tree root DirContext schema = dc.getSchema(""); // Get the schema object for "person" DirContext personSchema = (DirContext) schema.lookup("AttributeDefinition/" + name); Attributes a = personSchema.getAttributes(""); NamingEnumeration ane = a.getAll(); while (ane.hasMore()) { Attribute attr = (Attribute) ane.next(); String attrType = attr.getID(); NamingEnumeration values = attr.getAll(); while (values.hasMore()) { Object oneVal = values.nextElement(); if (oneVal instanceof String) { System.out.println(attrType + ": " + (String) oneVal); } else { System.out.println(attrType + ": " + new String((byte[]) oneVal)); } } } } catch (Exception e) { e.printStackTrace(); } } /** * 获取指定DN中指定名字的Attribute定义 * @param DN * @param name */ public void getDNAttributeDefinition(String DN, String name) { try { // Get an attribute of that type Attributes attrs = dc.getAttributes(DN, new String[]{name}); Attribute cnAttr = attrs.get(name); // Get its attribute type definition DirContext cnSchema = cnAttr.getAttributeDefinition(); // Get cnSchema's attributes Attributes cnAttrs = cnSchema.getAttributes(""); NamingEnumeration ane = cnAttrs.getAll(); while (ane.hasMore()) { Attribute attr = (Attribute) ane.next(); String attrType = attr.getID(); NamingEnumeration values = attr.ge- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA OpenLDAP 使用 心得
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【xrp****65】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【xrp****65】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【xrp****65】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【xrp****65】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文