IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> openLDAP win安装部署及java CRUD接口 -> 正文阅读

[网络协议]openLDAP win安装部署及java CRUD接口

目录

概述
测试环境
安装过程
配置启动
客户端介绍
多级DC的ldif文件的配置
java接口编写测试

[一]、概述

什么叫LDAP呢,概念的东西这里就不多讲了,网上搜索下有很多,本文的重点是介绍如何在windows平台上安装和配置openLDAP软件。

openLDAP官方网站:http://www.openldap.org/

[二]、测试环境

window10 – 64位
openLDAP 版本:2.4.49
官网下载地址:https://www.maxcrc.de/download/
本人下载地址:https://www.maxcrc.de/wp-content/uploads/2020/04/OpenLDAPforWindows_x86.zip

[三]、安装过程

按照提示 一直 next ,直到安装完成:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

安装完成后,在系统服务中,找到 OpenLDAP Service,先停止服务,再把启动类型修改成手动,便于自己的测试。

[四]、配置启动

安装目录:C:\OpenLDAP

编辑文件:C:\OpenLDAP\slapd.conf 找到如下内容:
1 suffix"dc=maxcrc,dc=com"
2 rootdn “cn=Manager,dc=maxcrc,dc=com”

 suffix"dc=maxcrc,dc=com"
 rootdn "cn=Manager,dc=maxcrc,dc=com"

改成

suffix"dc=micmiu,dc=com"
rootdn "cn=Manager,dc=micmiu,dc=com"

打开控制台,切换到openLDAP安装目录下,启动openLDAP,命令如下:

slapd.exe -d 1 -f ./slapd.conf

会在控制台看到类似如下的日志信息:
在这里插入图片描述
日志信息:slapd starting 表示服务已经启动好了。

新建一个文件:C:\OpenLDAP\mydemo.ldif ,内容如下:

dn:dc=micmiu,dc=com
objectclass:domain
objectclass:top
o:Michael Blog
dc:micmiu
 
dn:ou=Developer,dc=micmiu,dc=com
objectclass:organizationalUnit
ou:Developer
description:Container fordeveloper entries
 
dn:ou=Tester,dc=micmiu,dc=com
objectclass:organizationalUnit
ou:Tester
description:Container fortest entries
 
dn:uid=Michael,ou=Developer,dc=micmiu,dc=com
uid:Michael
objectClass:inetOrgPerson
mail:sjsky_007@gmail.com
userPassword:111111
labeledURI:http://www.micmiu.com
sn:Sun
cn:Michael Sun
 
dn:uid=Miumiu,ou=Tester,dc=micmiu,dc=com
uid:Miumiu
objectClass:inetOrgPerson
userPassword:111111
labeledURI:http://www.micmiu.com
sn:Wu
cn:Miumiu Wu

tips:格式要严格,每行的开头和末尾不能有空格

然后在控制台中切换到openLDAP安装目录下执行ldapadd命令:

slapadd -v -l mydemo.ldif -f slapd.conf

参数说明:

-x 使用简单验证方式
-D 指定管理员DN(与slapd.conf中配置的一致)
-W 大写W表示回车后根据提示输入密码,可以使用小写的-w password 直接输入密码
-f 需要导入数据LDIF的文件名
-h 目录服务器的IP地址
mydemo.ldif是文件的名称

添加成功会显示如下信息:
在这里插入图片描述
验证添加的信息,

先进入到OpenLDAP的ClientTools文件中
cd C:\OpenLDAP\ClientTools
在执行
ldapsearch-x-b"dc=micmiu,dc=com" "(objectclass=*)"

查询结果如下:
在这里插入图片描述
验证成功。

[五]、客户端介绍

网上搜索到一个客户端:LdapBrowser282 附件提供相关下载:http://www.micmiu.com/wp-content/uploads/2012/05/LdapBrowser282.zip

下载解压后直接双击:lbe.bat 文件即可运行。
在这里插入图片描述
选择localhost进入
在这里插入图片描述
可以正确查询到之前添加的相关信息。
在这里插入图片描述
[六]、Java调用接口

package com.doaron.controller;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.*;
import java.util.Hashtable;
import java.util.Vector;


public class TestOpenLDAP {
    DirContext dc = null;
    String account = "Manager";//操作LDAP的帐户。默认就是Manager。
    String password = "secret";//帐户Manager的密码。
    String root = "dc=micmiu,dc=com"; //LDAP的根节点的DC

  /*  public TestOpenLDAP() {
        //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"属性


        searchInformation("dc=example,dc=com", "", "(objectclass=*)");//遍历所有根节点

        //重命名节点"ou=new,o=neworganization,dc=example,dc=com"
        //renameEntry("ou=new,o=neworganization,dc=example,dc=com","ou=neworganizationalUnit,o=neworganization,dc=example,dc=com");

        //searchInformation("o=neworganization,dc=example,dc=com","","(objectclass=*)");//遍历指定节点的分节点
        close();
    }*/

    public  DirContext init() {
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://127.0.0.1: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);
        }
        return null;
    }

    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 = "hi1";
            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);*/


            //组织人员
            String newUserName = "hi2";
            BasicAttributes attrs = new BasicAttributes();
            BasicAttribute objclassSet = new BasicAttribute("objectClass");
            objclassSet.add("inetOrgPerson");
            attrs.put(objclassSet);
            attrs.put("ou", newUserName);
            attrs.put("uid","Tester1");
            attrs.put("sn","用户名称");
            attrs.put("cn","账号名称");
            attrs.put("mail","1575687@163.com");
            attrs.put("mobile","55758849");
            attrs.put("userPassword","234234");
            dc.createSubcontext("uid=hi2,ou=Demo,dc=app1,dc=micmiu,dc=com", 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("sn",
//                    "测试");
//            mods[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE,attr0);

            /*修改属性*/
            Attribute attr0 = new BasicAttribute("sn", "测试1");
            mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,
                    attr0);

            /*删除属性*/
//            Attribute attr0 = new BasicAttribute("sn",
//                    "Tester1");
//            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) {
        TestOpenLDAP testOpenLDAP=new TestOpenLDAP();
        //认证
        DirContext ctx = testOpenLDAP.init();

        //遍历所有根节点
        testOpenLDAP.searchInformation("uid=hi2,ou=Demo,dc=app1,dc=micmiu,dc=com","","(objectclass=*)");


        //添加
        //testOpenLDAP.add();


        //修改属性"ou=hi1,dc=micmiu,dc=com"属性
         //testOpenLDAP.modifyInformation("uid=hi2,ou=Demo,dc=app1,dc=micmiu,dc=com");

        //删除"ou=hi1,dc=micmiu,dc=com"节点
        // testOpenLDAP.delete("ou=hi1,"+ testOpenLDAP.root);



        //关闭
        testOpenLDAP.close();
    }
}

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-14 13:44:27  更:2021-09-14 13:46:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年6日历 -2024/6/27 1:45:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码