一、部署服务
启动LDAP容器
docker run -dit \
-p 389:389 -p 636:636 \
--name ldap_dev \
--env LDAP_ORGANISATION="test" \
--env LDAP_DOMAIN="example.com" \
--env LDAP_ADMIN_PASSWORD="123456" \
--restart always \
--detach osixia/openldap
其中
p 389:389 :TCP/IP访问端口
p 636:636 :SSL连接端口。
name ldap_dev :容器名称为your_ldap
env LDAP_ORGANISATION=“test” :配置LDAP组织名称
env LDAP_DOMAIN=“example.com” :配置LDAP域名
env LDAP_ADMIN_PASSWORD=“123456” :配置LDAP密码
启动phpLDAPAdmin容器(可有可无,主要提供可视化操作,不够自信的就装一个慢慢折腾)
docker run -dit \
-p 8089:80 \
--privileged \
--link ldap_dev \
--name ldap_admin \
--env PHPLDAPADMIN_HTTPS=false \
--env PHPLDAPADMIN_LDAP_HOSTS=ldap_dev \
--detach osixia/phpldapadmin
--privileged \ 为容器添加root权限
--link ldap_dev \链接到LDAP容器,可以看作是共享容器环境
--env PHPLDAPADMIN_HTTPS=false \ 关闭https链接
--env PHPLDAPADMIN_LDAP_HOSTS=ldap_dev \共用LDAP容器的端口
测试
ldapsearch -x -b "dc=example,dc=com" -H ldap:/// -D "cn=admin,dc=example,dc=com" -W
成功会返回所有该数据库存储的所有信息
或者登陆phpLDAPAdmin进行测试
账号可以先使用上面LDAP容器启动时的参数中的账号密码,等确认无误后再自行创建用户账号
cn=admin,dc=example,dc=com
123456
默认admin,dc=xxx,dc=xxx为管理员账户,如果登陆失败则检查账号是否完整,例如
--env LDAP_DOMAIN="127.0.0.1"
则默认管理员账号为:admin,dc=127,dc=0,dc=0,dc=1
登录成功后可以创建用户或分级:

同理,后续自行创建的用户账号若分级过多,则账号也会越来越长
例如在dc=example,dc=com根菜单下建立两级子菜单再建立账户则
目录为:example.com/Development/developer/zhou xin
用户账户为:cn=zhou xin,cn=developer,ou=Development,dc=example,dc=com:
登录后显示的账户:

二、验证账号
以Nodejs为例
var ldap = require("ldapjs");
//创建LDAP client,把服务器url传入
var client = ldap.createClient({
url: 'ldap://192.168.1.211:389',
});
//创建LDAP查询选项
//filter的作用就是相当于SQL的条件
var opts = {
filter: '(objectclass=*)', //查询条件过滤器,查找存在objectclass属性的节点
scope: 'sub', //查询范围
timeLimit: 500 //查询超时
};
//将client绑定LDAP Server
//第一个参数:用户账户,必须是从根节点到用户节点的全路径
//第二个参数:用户密码
// client.bind('cn=admin,dc=example,dc=com', '123456', function (err, res1) {// 使用默认管理员账户登陆
//这里使用自己创建的账号登陆尝试(故在进行密码校验时根据bind操作的err即可判断账户密码是否正确或存在)
client.bind('cn=zhou xin,cn=developer,ou=Development,dc=example,dc=com', '123456', function (err, res1) {
console.log(err); // 为空即表示账号可用,否则表示账号不可用
// console.log(res1);
//开始查询
//第一个参数:查询基础路径,代表在查询用户信息将在这个路径下进行,这个路径是由根节开始
//第二个参数:查询选项(即查询条件等)
client.search('dc=example,dc=cn', opts, function (err, res2) {
//查询结果事件响应
res2.on('searchEntry', function (entry) {
//获取查询的对象
var user = entry.object;
var userText = JSON.stringify(user,null,2);
console.log(userText);
});
res2.on('searchReference', function(referral) {
console.log('referral: ' + referral);
});
//查询错误事件
res2.on('error', function(err) {
console.error('error: ' + err);
//释放资源,否则一直占用进程
client.unbind();
});
//查询结束(其余事件前往npm查看库文档)
res2.on('end', function(result) {
console.log('search status: ' + result.status);
client.unbind();
});
});
});