【问题标题】:How to write search filter for searching a mobile number or telephone number in LDAP?如何编写搜索过滤器以在 LDAP 中搜索手机号码或电话号码?
【发布时间】:2014-09-03 10:40:22
【问题描述】:

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

我可以使用搜索过滤器在 LDAP 中搜索任何名称。但是当我尝试搜索任何手机号码或电话号码时,我收到了错误:request timeout (client interrupt)

这是我搜索名称时可以使用的 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;      
        });
    });
}

我在命令提示符下运行上述代码后得到的结果是:

认证 不明确的 搜索条目 不明确的 条目:%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" “区分 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":"任何公司名称","name":"anyname","sAMAccountName":"employeeID","mail":"mailid@ gmail.com","手机":"999-091-3918" }

接下来我需要在 LDAP 中搜索“mobile”字段。所以我所做的是,我将搜索过滤器重写为

var searchNumber = '999-091-3918';

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

并运行代码。

这次我得到error request timeout (client interrupt)。谁能帮我在 LDAP 中为手机和电话号码编写搜索过滤器?

【问题讨论】:

  • 手机号码是否作为多值属性存储在 LDAP 中?
  • 如果其中一位用户的手机号码为“9990913918”,则搜索结果应通过搜索手机号码给出该用户的信息

标签: node.js ldap


【解决方案1】:

您必须对 LDAP 过滤器字符串中的搜索值进行转义,因为 () 等字符具有特殊含义,并且在未转义时会破坏过滤器。

LDAP 过滤器字符串的字符转义模式是"\" 和字符的十六进制代码。 "(" 将是 "\28"

另见http://msdn.microsoft.com/en-us/library/aa746475.aspx,“特殊字符”部分

所以你的过滤器应该是(当然这也适用于“名称”等所有其他字段):

var opts = {
        filter:'(mobile=' + ldapFilterEscape(searchNumber) + ')',
        // etc, etc
    };

ldapFilterEscape 在哪里

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

【讨论】:

  • 以上链接中包含的特殊字符为*,(,),\,NUL,/。
  • 不,- 不需要编码,NUL 字符不能是 JavaScript 字符串的一部分,所以它们也不重要。我的回答有点猜测:您的 client interrupt 错误可能有完全不同的原因,但忘记转义 LDAP 过滤器总是是一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
相关资源
最近更新 更多