LDAP部署及用户校验

一、部署服务

启动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
登录成功后可以创建用户或分级:


BECF93FE-2D71-40d1-B237-8204A527CAEA.png

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


E252F670-9C7A-4019-AEC5-E00E2726227E.png

二、验证账号

以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();
     });    
     
   });
   
 });
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容