思路描述:
1、从客户端得到登陆名和密码。注意这里的密码第一次查询的时候没有用到,第二次才用到。
2、用默认用户和密码绑定到LDAP服务器。
3、通过基础路径和查询选项,来查询对应用户信息。注意这里的查询选项会用到客户端输入的登陆名。
4、如果能正确查询并返回用户信息,然后再通过entry的DN和客户端输入的密码重新绑定LDAP服务器。
5、执行完上一步,主要流程就结束了,如果绑定成功,那么说明验证成功,如果不行,则返回对应的错误信息。
下面是koa1示例,仅供参考:
var resObj = yield new Promise(function(resolve, reject){ var ldap = require("ldapjs"); //创建LDAP client,把服务器url传入 var client = ldap.createClient({ url: 'ldap://192.168.11.22:389' }); //创建LDAP查询选项 //filter的作用就是相当于SQL的条件 var opts = { filter: `(sAMAccountName=${username})`, //查询条件过滤器,查找uid=kxh的用户节点 scope: 'sub', //查询范围 timeLimit: 500 //查询超时 }; //将client绑定LDAP Server //第一个参数:是用户,必须是从根节点到用户节点的全路径 //第二个参数:用户密码 client.bind('testUsername', 'testPassword', function (err1, res1) { //开始查询 //第一个参数:查询基础路径,代表在查询用户信心将在这个路径下进行,这个路径是由根节开始 //第二个参数:查询选项 client.search('DC=test,DC=com', opts, function (err2, res2) { //查询结果事件响应 res2.on('searchEntry', function (entry) { //获取查询的对象 var user = entry.object; // var userText = JSON.stringify(user,null,2); // console.log(userText); console.log(user.dn); // 用户认证 client.bind(user.dn, password, function (err3, res3) { if(err3){ console.error('error: ' + err3.message); resolve(null); }else{ var obj = {}; obj.groupName = user.description; resolve(obj); } client.unbind(); }); }); // res2.on('searchReference', function(referral) { // console.log('referral: ' + referral.uris.join()); // }); //查询错误事件 res2.on('error', function(err4) { console.error('error: ' + err4.message); //unbind操作,必须要做 client.unbind(); resolve(null); }); // //查询结束 // res2.on('end', function(result) { // // console.log('search status: ' + result.status); // //unbind操作,必须要做 // client.unbind(); // }); }); }); }).then(function (res){ return res; });