Node.js 如何编写搜索筛选器以在LDAP中搜索移动电话号码或电话号码?

Node.js 如何编写搜索筛选器以在LDAP中搜索移动电话号码或电话号码?,node.js,ldap,Node.js,Ldap,我想使用搜索过滤器查询LDAP。为了连接到LDAP服务器,我使用node.js 我可以使用搜索过滤器在LDAP中搜索任何名称。但是当我试图搜索任何移动电话号码或电话号码时,我得到了一个错误:请求超时(客户端中断) 下面是我搜索名称时使用的node.js代码: var ldap = require('ldapjs'); var sys = require('sys'); var assert = require('assert-plus'); var username = 'XXXXXX

我想使用搜索过滤器查询LDAP。为了连接到LDAP服务器,我使用node.js

我可以使用搜索过滤器在LDAP中搜索任何名称。但是当我试图搜索任何移动电话号码或电话号码时,我得到了一个错误:
请求超时(客户端中断)

下面是我搜索名称时使用的node.js代码:

var ldap = require('ldapjs');
var sys   = require('sys');
var assert   = require('assert-plus');

var username = 'XXXXXXX';
var password = 'XXXXXXX';
var domain = "cts.com";
var searchBase = 'dc=cts,dc=com';


var client = ldap.createClient({
    url: 'ldap://myipaddress:portnumber',
    bindDN: "cts.com",
    timeout: 5000,
    connectTimeout: 10000
});

client.bind('cts\\'+username, password, function (err) {
    if (err) {
        console.log(err);
        client.unbind(function (err) {
            console.log('3');
            if (!err) {
                console.log('successfully unbind');
            }
            else {
                console.log(err);
            }
        });
    } else {
        console.log('authenticated');
        var searchResult = search();
    }
});

function search(){
    var opts = {
        filter:'(sAMAccountName='+username+')',
        scope: 'sub',
        attributes: ['sAMAccountName','name','givenName','distinguishedName','displayName','cn','sn',
                    'mail','title','description','department','company','manager',
                    'telephoneNumber','mobile','co','c','l','st','postalCode'],
    };

    client.search(searchBase, opts, function(err, res) {
        assert.ifError(err);

        res.on('searchEntry', function(entry) {
            console.log('searchEntry');
            var user = entry.object;
            console.log(user.objectGUID);
            if(entry.object){
                console.log('entry: %j ' + JSON.stringify(entry.object))
            }
        });
        res.on('searchReference', function(referral) {
            console.log('searchReference');
            console.log('referral: ' + referral.uris.join());
        });
        res.on('error', function(err) {
            console.error('error: ' + err.message);
        });
        res.on('end', function(result) {
            console.log('status: ' + result.status);
            return result;      
        });
    });
}
在命令提示符下运行上述代码后得到的结果是:

authenticated undefined searchEntry undefined entry: %j {"dn":"CN=anyname,OU=Users,OU=DLF,OU=Chennai,OU=India,OU=APAC,OU=mycompanyname,DC=cts,DC=com","controls":[],"cn":"name","sn":"K-5","c":"IN","l":"C hennai","st":"TN","title":"Developer","description":"Associate","postalCode":"600089","telephoneNumber":"123455","givenName":"XXXXXXXXX","distinguis hedName":"CN=XXXXXXXX,OU=Users,OU=DLF,OU=Chennai,OU=India,OU=APAC,OU=Cognizant,DC=cts,DC=com","displayName":"XXXXXXXX","co":"IND","department":"Mobility-MM","company":"Any Company Name","name":"anyname","sAMAccountName":"employeeID","mail":"mailid@gmail.com","mobile":"999-091-3918" } 然后运行代码


这次我得到了
错误请求超时(客户端中断)
。有谁能帮助我如何在LDAP中编写移动电话号码和电话号码的搜索筛选器吗?

您必须在LDAP筛选器字符串中转义搜索值,因为像
这样的字符具有特殊意义,如果不转义,则会中断筛选器

LDAP筛选器字符串的字符转义模式是
“\”
,字符的十六进制代码<代码>“(“将是
”\28“

另请参见“特殊字符”一节

因此,您的过滤器应该是(当然,这也适用于所有其他字段,如“名称”):

其中
ldapFilterEscape

function ldapFilterEscape(str) {
    return str.replace(/[*()\\\/]/g, function ($0) {
        return "\\" + $0.charCodeAt(0).toString(16);
    });
}

移动电话号码是否作为多值属性存储在LDAP中?如果其中一个用户的移动电话号码为“9990913918”,则搜索结果应通过搜索移动电话号码提供该用户的信息上述链接中包含的特定字符为*,(,),\,NUL,/。不,不需要对
-
进行编码,而且
NUL
字符不能是JavaScript字符串的一部分,因此它们也不重要。我的回答有点猜测:您的
客户端中断
错误可能有完全不同的原因,但忘记转义LDAP筛选器总是一个错误。
var opts = {
        filter:'(mobile=' + ldapFilterEscape(searchNumber) + ')',
        // etc, etc
    };
function ldapFilterEscape(str) {
    return str.replace(/[*()\\\/]/g, function ($0) {
        return "\\" + $0.charCodeAt(0).toString(16);
    });
}