.top pre { display: block; background: rgba(68, 67, 65, 1); color: rgba(255, 255, 255, 1); margin: 10px 0 !important; padding: 10px !important; width: auto !important; float: none !important; clear: none !important; border: 1px solid rgba(227, 227, 227, 1); border-radius: 6px; font-size: 14px; overflow: auto }
.top { }

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所有的必须属性。

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

上面所展示的就是一个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文件来修改。

编辑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是什么样的:

另外还有 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();
}
}
}
}

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

LDAP学习的更多相关文章

  1. LDAP学习小结【仅原理和基础篇】

    此篇文章花费了好几个晚上,大部分是软件翻译的英文文档,加上自己的理解所写,希望学习者能尊重每个人的努力. 我有句话想送给每个看我文章的人: 慢就是快,快就是慢!!! 另外更希望更多人能从认真从原理学习 ...

  2. LDAP学习总结

    一.简介: LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议.目录是一个为查询.浏览和搜索而优化的数据库,它成树状结构组织数据,类 ...

  3. LDAP学习笔记总结

    一.LDAP概念LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.它是基于X.500标准的,但是简单多了并且可以根 ...

  4. 【JMeter4.0学习(二)】之搭建openLDAP在windows8.1上的安装配置以及JMeter对LDAP服务器的性能测试脚本开发

    目录: 概述 安装测试环境 安装过程 配置启动 配置搭建OpenLDAP 给数据库添加数据 测试查询刚刚插入的数据 客户端介绍 JMeter建立一个扩展LDAP服务器的性能测试脚本开发 附:LDAP学 ...

  5. LDAP未授权访问学习

    LDAP未授权访问学习 一.LDAP 介绍 LDAP的全称为Lightweight Directory Access Protocol(轻量级目录访问协议), 基于X.500标准, 支持 TCP/IP ...

  6. 关于ldap的学习

    主要从以下网站学习了相关基础知识概念,安装与基本配置. http://www.aikaiyuan.com/8269.htmlhttps://segmentfault.com/a/11900000026 ...

  7. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  8. [原创]django+ldap+memcache实现单点登录+统一认证

    前言 由于公司内部的系统越来越多,为了方便用户使用,通过django进行了单点登录和统一认证的尝试,目前实现了django项目的单点登录和非django项目的统一认证,中间波折挺多,涉及的技术包括dj ...

  9. ldap部署相关,ldap双机\LAM配置管理\ldap备份还原

    前言 接之前我的文章,django+ldap+memcache实现单点登录+统一认证 就单点登录实现过程进行详细记录,ldap是一切的基础,可以把它理解成一个读强写弱的文件类型数据库,统一认证我们通过 ...

随机推荐

  1. oracle 19c dataguard aws ORA-03186报错

    环境说明 在亚马逊云AWS上面安装了一套oracle 19c dataguard,linux centos 7.7的操作系统,开始时同步正常,实时应用redolog,一会儿之后就不行了.报错如下: o ...

  2. Qt学习笔记-制作一个文本编辑器

    创建一个MainWindow工程.添加一个TextEdit.垂直布局. 在menu上面创建新的action. 在新建的时候判断文本有没有被修改. 下面,将某个文件打开读入到TextEdit中. 保存文 ...

  3. WebSocket协议 与 IO多路复用

    最近在把 Facebook Message 接入客服系统,由于与 Facebook Message 对接的收发消息都是通过调用 http 接口来实现的,如果想实现即时通讯,还需要在中间加一个 WebS ...

  4. 远程分支删除后,git branch -a还能看到的解决方法

    详情https://www.cnblogs.com/wangiqngpei557/p/6058115.html 大家在删除远程分支后 git branch -a 还是可以看到已删除的远程分支,时间一长 ...

  5. 010_MySQL

    目录 初识MySQL 为什么学习数据库 什么是数据库 数据库分类 MySQL简介 Windows安装MySQL 安装建议 软件下载 安装步骤 安装SQLyog 下载安装 连接数据库 简单操作 命令行连 ...

  6. 为什么.NET Standard 仍然有意义?

    .NET Standard 是.NET 官方的API规范,可在许多.NET环境中使用.之所以存在,面向.NET Standard 2.0的库提供了最大可能的覆盖范围,并启用了几乎所有现代的.NET功能 ...

  7. ASP.NET Core中的数据保护

    在这篇文章中,我将介绍ASP.NET Core 数据保护系统:它是什么,为什么我们需要它,以及它如何工作. 为什么我们需要数据保护系统? 数据保护系统是ASP.NET Core使用的一组加密api.加 ...

  8. 【SpringMVC】SpringMVC 入门

    SpringMVC 入门 文章源码 SpringMVC 基本概念 在 JavaEE 开发中,几乎全都是基于 B/S 架构的开发.在 B/S 架构中,系统标准的三层架构包括:表现层.业务层.持久层. 表 ...

  9. 大数相加Java

    题目 以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回. 分析 两个字符串,定义两个指针,分别从这两个字符串的结尾开始遍历,因为可能字符串1比字符串2长度要长,因此只要两者其中有 ...

  10. Tomcat配置上遇到的一些问题

    Tomcat启动:在bin目录下双击startup.bat文件就行. 访问:在浏览器输入http://localhost:8080 回车访问的是自己 的界面: http://othersip:8080 ...