LDAP概述

目录系统是关于某些类别的对象(例如人)的信息列表。目录可以用于查找特定对象的信息,也可以反方向查找满足特定需求的对象。 企业中的员工通讯录就是一个目录系统。目录访问协议(directory access protocol)就是用来访问目录中数据的标准化方式。最广泛使用的是 轻量级目录访问协议(lightweight directory access protocol,LDAP),openldap是LDAP的一个开源实现。

LDAP数据模型

在LDAP目录中存储的是类似于面向对象语言中 对象 的条目(entry)。每个条目必须有一个能标示自己的 可区别名称(distinguished name, DN),DN又由一组 相对可区别名称(relative DN, RDN)组成。
例如(下面的例子都存在于我们后面将要搭建的openldap环境中):
cn=user01,ou=People,dc=massclouds,dc=com
这个DN唯一标示的条目代表了目录中的一个人。 其中各个RDN的含义是:
cn: common name(s) for which the entity is known by
ou: organizational unit this object belongs to
dc: domain component

就像面向对象语言中的对象一样,条目 也有所属的类,也拥有自己的属性。条目可以属于多个类,这些类也拥有继承关系。 而条目中的属性就是定义在这些类中的。关于objectclass 、属性的规则是定义在schema中的。

下面是定义一个条目的LDIF(LDAP Data Interchange Format, LDAP数据交换格式):

dn: cn=user01,ou=People,dc=massclouds,dc=com
cn: user01
gidnumber: 500
homedirectory: /home/user01
loginshell: /bin/bash
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: user01
title:  
uid: user01
uidnumber: 836031732
userpassword: {SSHA}25vgYD/sRglAUSKLKfIU7hya9Kp/cFUS

 上面的例子中,表示user01的条目属于三个objectclass: inetOrgPerson 、posixAccount和top。 objectclass分为 结构型、辅助型和抽象型,每个条目必须要属于一个结构型的objectclass。 在objectclass中定义了必须的属性和可选的属性,条目如果属于某个objectclass,那么就必须要有这个objectclass所有的必须属性。

LDA模型 python代码 lda csdn_客户端

 

条目按照它们的DN组织成一颗 目录信息数(Directory Intermation Tree, DIT),树的叶子节点通常表示特定的对象,而内部节点表示组织、部门等上层信息。 一个节点必然会包含它父节点的所有RDN。

LDA模型 python代码 lda csdn_php_02

 

上面所展示的就是一个DIT,叶子节点分别表示 管理员节点(cn=ldapadm),具体的用户组(cn=ldapusers)和具体的用户(cn=a_001),而其他内部节点则是用来分类管理这些叶子节点的上层节点。从这颗DIT中我们可以得到user01完整的dn为:cn=user01,ou=People,dc=massclouds,dc=com, 而People这个内部节点的完整dn为: ou=People,dc=massclouds,dc=com, 子节点完全拥有父节点的所有rdn。

 

搭建OpenLDAP环境

在网上可以找到很多搭建openldap的文章,但很多都是针对比较旧的版本的。 下面的步骤基本来自 Step by Step OpenLDAPServer Configuration on CentOS 7 / RHEL 7  这篇文章,这里记录下来留作自己参考,你也可以直接阅读原文就好了。

 环境:

   openladp-server: 192.168.107.177 (centos 7)

   openldap-client :   192.168.107.178 (centos 7)

搭建服务端:

安装软件:

yum -y install OpenLDAPcompat-OpenLDAPopenldap-clients openldap-servers openldap-servers-sql openldap-devel

启动服务和开机启动(slapd是openldap-servers的服务名):

systemctl start slapd.service
systemctl enable slapd.service

 389是openldap的默认端口,验证服务是否启动:

netstat -altpn | grep 389
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      4358/slapd          
tcp6       0      0 :::389                  :::*                    LISTEN      4358/slapd

 OpenLDAP有一个创建密码的工具 slappasswd,在下面介绍jldap的内容中会有一个 算法逻辑相同的 java实现。

-h 指定加密算法 {MD5} {ssha}等 -s 指定希望加密的明文密码

slappasswd -h {ssha} -s 123456
{SSHA}aMRnRqs2Kicc0ZtSsaU2B3Duhc2CFxO6

 我们需要使用slappasswd生成一个管理员密码,例如上面由123456生成的那个,并把它保存起来,后面会用到。

配置OpenLDAPserver:

OpenLDAPservers 的配置文件在/etc/openldap/slapd.d/下面。我们需要修改“olcSuffix”和“oldRootDN”。

olcSuffix:ldap数据库前缀,它是LDAP server提供信息的域名,简单来讲就是你当前机器的域名,我的环境为massclouds.com。

olcRootDN: LDAP上超级管理员的DN

olcRootPW: RootDN的密码

我们其实想要修改的内容就存在于/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif 中,但是直接修改是OpenLDAP不建议的,所以我们通过编写一个LDIF文件来修改。

LDA模型 python代码 lda csdn_LDA模型 python代码_03

编辑db.ldif 如下:

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=massclouds,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=ldapadm,dc=massclouds,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
#这里就是刚才保存下来的那个加密后的密码
olcRootPW: {SSHA}o9CdHYvIqTp2o5RvA4Ci+wBUTwMHfN9J

 注意replace: olcRootPW中冒号后面有一个空格,并且最后面也不要有任何空格或制表符。执行以下命令:

ldapmodify -Y EXTERNAL  -H ldapi:/// -f db.ldif

 执行完成后,你会发现/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif的内容已经发生了变化。

修改/etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif (不要手动编辑)文件来只允许root(ldapadm)可以监控访问。编辑monitor.ldif 如下:

dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external, cn=auth" read by dn.base="cn=ldapadm,dc=massclouds,dc=com" read by * none

 执行:

ldapmodify -Y EXTERNAL  -H ldapi:/// -f monitor.ldif

 

 创建LDAP证书

 我们为LDAP服务器创建一个自签发的证书,下面的命令将在/etc/openldap/certs/目录中生成证书和私钥。

[root@localhost ~]#  openssl req -new -x509 -nodes -out /etc/openldap/certs/masscloudsldapcert.pem -keyout /etc/openldap/certs/masscloudsldapkey.pem -days 365


Generating a 2048 bit RSA private key
........................................................+++
....................................+++
writing new private key to '/etc/openldap/certs/masscloudsldapkey.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shandong
Locality Name (eg, city) [Default City]:jinan 
Organization Name (eg, company) [Default Company Ltd]:Massclouds  Technology Co., Ltd                                                
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

 修改生成的证书和私钥的权限

chown -R ldap:ldap /etc/openldap/certs/*.pem

 有了证书后,我们就可以配置OpenLDAP使用我们的证书安全通信了。编辑certs.ldif, 如下:

dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/openldap/certs/masscloudsldapcert.pem

dn: cn=config
changetype: modify
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/openldap/certs/masscloudsldapkey.pem

 执行:

ldapmodify -Y EXTERNAL  -H ldapi:/// -f certs.ldif

 配置这些之后,我们可以验证配置是否正确:

[root@localhost ~]# slaptest -u
config file testing succeeded

 

建立LDAP数据库:

复制下面的这个数据库配置文件到/var/lib/ldap中,并更改文件权限。

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap /var/lib/ldap/*

添加cosine和nis LDAP schema (这些schema中定义了基本的objectclass,attribute)

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif 
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

 创建base.ldif,如下:

#根节点
dn: dc=massclouds,dc=com
dc: massclouds
objectClass: top
objectClass: domain

#管理员节点
dn: cn=ldapadm ,dc=massclouds,dc=com
objectClass: organizationalRole
cn: ldapadm
description: LDAP Manager

#管理所有人员的上层节点,它的子节点就是一个个表示具体人的叶子节点
dn: ou=People,dc=massclouds,dc=com
objectClass: organizationalUnit
ou: People

#管理所有组的上层节点,它的子节点就是一个个表示具体组的叶子节点
dn: ou=Group,dc=massclouds,dc=com
objectClass: organizationalUnit
ou: Group

 我们看一下上面这个文件,这里面定义的四个节点就构成了目录信息数(DIT)的大体结构,下面我们使用root(ldapadm)来将这些节点加入到ldap中。

[root@localhost ~]# ldapadd -x -W -D "cn=ldapadm,dc=massclouds,dc=com" -f base.ldif 

Enter LDAP Password: 
adding new entry "dc=massclouds,dc=com"
adding new entry "cn=ldapadm ,dc=massclouds,dc=com"
adding new entry "ou=People,dc=massclouds,dc=com"
adding new entry "ou=Group,dc=massclouds,dc=com"

 上面提示输入的就是在最开始我们为root(ldapadm)设置的那个密码。我们看到输出信息中已经提示为我们的目录信息数加入了四个节点。

下面我们来创建表示具体组和人的叶子节点,创建group.ldif(我们后面会讲到openldap的web控制台phpldapadmin,在其中我们可以更方便的执行节点操作)

dn: cn=ldapusers,ou=Group,dc=massclouds,dc=com
cn: ldapusers
gidnumber: 500
objectclass: posixGroup
objectclass: top

 执行:

ldapadd -x -W -D "cn=ldapadm,dc=massclouds,dc=com" -f group.ldif

 创建 user01.ldif,如下:

dn: cn=user01,ou=People,dc=massclouds,dc=com
cn: user01
gidnumber: 500
homedirectory: /home/user01
loginshell: /bin/bash
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: top
sn: user01
uid: user01
uidnumber: 836031732
userpassword: {SSHA}wslbkdgQZUAnv+MvYgR3U1DGxSR8hwSL

 执行:

ldapadd -x -W -D "cn=ldapadm,dc=massclouds,dc=com" -f user01.ldif

 到此为止,我们就一共创建了六个节点,我们到phpldapadmin上面看一下DIT是什么样的:

LDA模型 python代码 lda csdn_php_04

另外还有 ldapsearch ldapdelete 等命令拥有查找、删除 等操作,就不介绍了。

配置ldap日志

配置Rsyslog来记录LDAP事件到日志文件 /var/log/ldap.log中。修改/etc/rsyslog.conf在后面加上一句:

local4.* /var/log/ldap.log

 然后重启rsyslog服务,并重启slapd让ldap有事件发生,就会看到生成ldap.log文件了。

systemctl restart rsyslog
systemctl restart slapd

 最后不要忘记放开防火墙:

firewall-cmd --permanent --add-service=ldap
firewall-cmd --reload

 到此为止我们就已经搭建完成OpenLDAP的服务端了,下面我们来搭建OpenLDAP的客户端,这里需要说明一下,我们这里将使用OpenLDAP来集中管理客户端的账号,也就是说存在于server上的用户(例如上面创建的那个user01)可以直接在 client上登录。

 

安装软件

登录到客户端环境中,执行:

yum install -y openldap-clients nss-pam-ldapd

执行下面的命令来将客户端机器加入到LDAP server中来认证。 把下面的“192.168.107.177” 替换为你自己的LDAP server的ip或者hostname。

authconfig --enableldap --enableldapauth --ldapserver=192.168.107.177 --ldapbasedn="dc=massclouds,dc=com" --enablemkhomedir --update

 重启客户端服务:

systemctl restart  nslcd

 到此我们就在客户端机器上配置完了,也就是说现在我们就可以在LDAP server上集中管理这台客户端机器上的账号了。

验证:

[root@localhost ~]# getent passwd user01
user01:*:836031732:500:user01:/home/user01:/bin/bash

 在这台客户端中,的确是不存在user01这个用户的。

 当我们使用user01 ssh登录客户端机器时可能会出现无法创建家目录的情况,关闭selinux就可以。

 

搭建LDAP web 控制台 phpLDAPadmin

phpLDAPadmin是使用php实现的一个管理OpenLDAP的web程序,我们将它部署在Apache Web Server(httpd)上,关于如何配置httpd就不再赘述了。

安装php环境:

yum -y install php php-mbstring php-pear php-ldap

下载phpldapadmin的安装文件,解压缩到/var/www/html目录中

wget https://nchc.dl.sourceforge.net/project/phpldapadmin/phpldapadmin-php5/1.2.3/phpldapadmin-1.2.3.zip
unzip phpldapadmin-1.2.3.zip
mv phpldapadmin-1.2.3 phpldapadmin

 得到phpLDAPadmin的部署文件后,我们还要去配置需要访问的LDAP 服务器信息。

 把/var/www/html/phpldapadmin/config/config.php.example 文件重命名为 /var/www/html/phpldapadmin/config/config.php, 然后在300行左右,把注释去掉,并修改如下:

293 $servers->setValue('server','host','192.168.107.177');
294 
295 /* The port your LDAP server listens on (no quotes). 389 is standard. */
296 $servers->setValue('server','port',389);
297 
298 /* Array of base DNs of your LDAP server. Leave this blank to have phpLDAPadmin
299    auto-detect it for you. */
300 $servers->setValue('server','base',array('dc=massclouds,dc=com'));

 之后重启httpd就可以了。在登录的时候,我遇到了无法验证用户的问题,同样是关闭seLinux后就好了。

然后我们访问http://你的ip或域名/phpldapadmin/index.php 就可以访问了。点击左侧的登录按钮登录即可,登录DN是LDAP服务器上管理员的DN,密码就是管理员密码。 登录进去以后,我们就可以对整棵目录信息树(DIT)进行操作了。

 

使用JLDAP 访问LDAP

JLDAP是一个java实现的访问LDAP的第三方工具。 下面的大多数代码都直接来自 jldap实现Java对LDAP的基本操作 这篇文章,除此之外最主要的是有一个和 slappasswd 功能相同的计算OpenLDAP密码的java实现。

 

 新增节点:

package com.massclouds.test;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import org.apache.commons.codec.binary.Base64;

import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPAttributeSet;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPEntry;
import com.novell.ldap.LDAPException;

public class LDAPAddEntry {
    /**
     * Openldap 产生SSHA密码的算法
     * 效果等同于 slappasswd -h {ssha} -s password
     * @param password
     * @return
     * @throws NoSuchAlgorithmException
     * @throws UnsupportedEncodingException 
     */
    public static String generateSSHAPwd(String password)
            throws NoSuchAlgorithmException, UnsupportedEncodingException {
        final int SALT_LENGTH = 4;
        SecureRandom secureRandom = new SecureRandom();
        byte[] salt = new byte[SALT_LENGTH];
        secureRandom.nextBytes(salt);

        MessageDigest crypt = MessageDigest.getInstance("SHA-1");
        crypt.reset();
        crypt.update(password.getBytes("utf-8"));
        crypt.update(salt);
        byte[] hash = crypt.digest();

        byte[] hashPlusSalt = new byte[hash.length + salt.length];
        System.arraycopy(hash, 0, hashPlusSalt, 0, hash.length);
        System.arraycopy(salt, 0, hashPlusSalt, hash.length, salt.length);
        
        return new StringBuilder().append("{SSHA}")
                .append(new String(Base64.encodeBase64(hashPlusSalt), Charset.forName("utf-8")))
                .toString();
    }
    
    public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {

        String ldapHost = "192.168.107.177"; //ldap服务端地址
        String loginDN = "cn=ldapadm,dc=massclouds,dc=com"; //ldap管理员DN
        String password = "secret"; //ldap管理员密码
        String containerName = "dc=massclouds,dc=com"; //目录信息树(DIT)的根节点

        int ldapPort = LDAPConnection.DEFAULT_PORT;
        int ldapVersion = LDAPConnection.LDAP_V3;
        LDAPConnection lc = new LDAPConnection();
        LDAPAttributeSet attributeSet = new LDAPAttributeSet();

        attributeSet.add(new LDAPAttribute("objectClass", new String[]{"inetOrgPerson",  "posixAccount", "top"}));
        
        attributeSet.add(new LDAPAttribute("uid", "zhangsan")); //uid 是登录系统的用户名
        attributeSet.add(new LDAPAttribute("sn", "zhangsan")); 
        attributeSet.add(new LDAPAttribute("cn", "zhangsan")); 
        attributeSet.add(new LDAPAttribute("uidNumber", "10000"));  

        
        attributeSet.add(new LDAPAttribute("loginShell", "/bin/bash"));
        attributeSet.add(new LDAPAttribute("homeDirectory", "/home/zhangsan")); 
        attributeSet.add(new LDAPAttribute("userPassword", generateSSHAPwd("111111")));
        attributeSet.add(new LDAPAttribute("gidNumber", "500"));
        
        String dn = "cn=cn,ou=People,dc=massclouds,dc=com";
        LDAPEntry newEntry = new LDAPEntry(dn, attributeSet);
        try {
            lc.connect(ldapHost, ldapPort);
            lc.bind(ldapVersion, loginDN, password.getBytes("UTF8"));
            System.out.println("login ldap server successfully.");
            lc.add(newEntry);
            
            
            System.out.println("Added object: " + dn + " successfully.");
        } catch (LDAPException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            System.out.println("Error: " + e.toString());
        } finally {
            try {
                if (lc.isConnected()) {
                    lc.disconnect();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

 

 删除节点:

package com.massclouds.test;

import java.io.UnsupportedEncodingException;

import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPException;

public class LDAPDeleteEntry {

    public static void main(String[] args) {

        String ldapHost = "192.168.107.177";
        String loginDN = "cn=ldapadm,dc=massclouds,dc=com";
        String password = "secret";
        //要删除节点的DN
        String deleteDN = "cn=cheng zhang,ou=People,dc=massclouds,dc=com";

        int ldapPort = LDAPConnection.DEFAULT_PORT;
        int ldapVersion = LDAPConnection.LDAP_V3;
        LDAPConnection lc = new LDAPConnection();
        try {
            lc.connect(ldapHost, ldapPort);
            lc.bind(ldapVersion, loginDN, password.getBytes("UTF8"));

            lc.delete(deleteDN);
            System.out.println(" delete Entry: " + deleteDN + " success.");
            lc.disconnect();
        } catch (LDAPException e) {
            if (e.getResultCode() == LDAPException.NO_SUCH_OBJECT) {
                System.err.println("Error: No such object");
            } else if (e.getResultCode() == LDAPException.INSUFFICIENT_ACCESS_RIGHTS) {
                System.err.println("Error: Insufficient rights");
            } else {
                System.err.println("Error: " + e.toString());
            }
        } catch (UnsupportedEncodingException e) {
            System.out.println("Error: " + e.toString());
        } finally {
            try {
                if (lc.isConnected()) {
                    lc.disconnect();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

}

 

修改属性( 包括新增、删除和替换属性)

package com.massclouds.test;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;

import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPException;
import com.novell.ldap.LDAPModification;

public class LDAPModifyAttrs {
    public static String generateSSHAPwd(byte[] password)
            throws NoSuchAlgorithmException {
        final int SALT_LENGTH = 4;
        SecureRandom secureRandom = new SecureRandom();
        byte[] salt = new byte[SALT_LENGTH];
        secureRandom.nextBytes(salt);

        MessageDigest crypt = MessageDigest.getInstance("SHA-1");
        crypt.reset();
        crypt.update(password);
        crypt.update(salt);
        byte[] hash = crypt.digest();

        byte[] hashPlusSalt = new byte[hash.length + salt.length];
        System.arraycopy(hash, 0, hashPlusSalt, 0, hash.length);
        System.arraycopy(salt, 0, hashPlusSalt, hash.length, salt.length);
        
        return new StringBuilder().append("{SSHA}")
                .append(Base64.getEncoder().encodeToString(hashPlusSalt))
                .toString();
    }
    
    public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {

        String ldapHost = "192.168.107.177";
        String loginDN = "cn=ldapadm,dc=massclouds,dc=com";
        String password = "admin==1";
        String modifyDN = "cn=weiying,ou=People,dc=massclouds,dc=com";

        int ldapPort = LDAPConnection.DEFAULT_PORT;
        int ldapVersion = LDAPConnection.LDAP_V3;
        LDAPConnection lc = new LDAPConnection();

        List<LDAPModification> modList = new ArrayList<LDAPModification>();

        LDAPAttribute attribute = new LDAPAttribute("userPassword", generateSSHAPwd("11111".getBytes("utf-8")));
        //这里除了REPLACE还可以ADD,DELETE,表示新增和删除节点
        modList.add(new LDAPModification(LDAPModification.REPLACE, attribute));

        LDAPModification[] mods = new LDAPModification[modList.size()];
        mods = (LDAPModification[]) modList.toArray(mods);

        try {
            lc.connect(ldapHost, ldapPort);
            lc.bind(ldapVersion, loginDN, password.getBytes("UTF8"));
            lc.modify(modifyDN, mods);
            System.out
                    .println("LDAPAttribute add、replace、delete all successful.");
        } catch (LDAPException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            System.out.println("Error: " + e.toString());
        } finally {
            try {
                if (lc.isConnected()) {
                    lc.disconnect();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

}

 

 

 查询节点:

package com.massclouds.test;


import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Iterator;

import com.novell.ldap.LDAPAttribute;
import com.novell.ldap.LDAPAttributeSet;
import com.novell.ldap.LDAPConnection;
import com.novell.ldap.LDAPEntry;
import com.novell.ldap.LDAPException;
import com.novell.ldap.LDAPSearchResults;
import com.novell.ldap.util.Base64;

public class QueryTest {
    public static void main(String[] args) {

        String ldapHost = "192.168.107.177";
        String loginDN = "cn=ldapadm,dc=massclouds,dc=com";
        String password = "secret";
        String searchBase = "dc=massclouds,dc=com";
        String searchFilter = "objectClass=*";

        int ldapPort = LDAPConnection.DEFAULT_PORT;
        // 查询范围
        int searchScope = LDAPConnection.SCOPE_SUB;

        LDAPConnection lc = new LDAPConnection();
        try {
            lc.connect(ldapHost, ldapPort);
            lc.bind(LDAPConnection.LDAP_V3, loginDN, password.getBytes("UTF8"));
            LDAPSearchResults searchResults = lc.search(searchBase,
                    searchScope, searchFilter, null, false);

            while (searchResults.hasMore()) {
                LDAPEntry nextEntry = null;
                try {
                    nextEntry = searchResults.next();
                } catch (LDAPException e) {
                    System.out.println("Error: " + e.toString());
                    if (e.getResultCode() == LDAPException.LDAP_TIMEOUT
                            || e.getResultCode() == LDAPException.CONNECT_ERROR) {
                        break;
                    } else {
                        continue;
                    }
                }
                
                System.out.println("DN =: " + nextEntry.getDN());
                System.out.println("|---- Attributes list: ");
                
                LDAPAttributeSet attributeSet = nextEntry.getAttributeSet();
                Iterator<LDAPAttribute> allAttributes = attributeSet.iterator();
                while (allAttributes.hasNext()) {
                    LDAPAttribute attribute = allAttributes.next();
                    String attributeName = attribute.getName();
                    
                    Enumeration<String> allValues = attribute.getStringValues();
                    if (null == allValues) {
                        continue;
                    }
                    while (allValues.hasMoreElements()) {
                        String value = allValues.nextElement();
                        
                        if (!Base64.isLDIFSafe(value)) {
                            // base64 encode and then print out
                            value = Base64.encode(value.getBytes());
                        }
                        System.out.println("|---- ---- " + attributeName
                                + " = " + value);
                    }
                }
            }

        } catch (LDAPException e) {
            System.out.println("Error: " + e.toString());
        } catch (UnsupportedEncodingException e) {
            System.out.println("Error: " + e.toString());
        } finally {
            try {
                if (lc.isConnected()) {
                    lc.disconnect();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

 

 以上就是增删改查的基本操作。