const ldapConfig = {
url: 'ldap://your-ldap-server',
bindDN: 'cn=admin,dc=example,dc=com',
bindCredentials: 'admin-password',
searchBase: 'dc=example,dc=com',
searchOptions: {
scope: 'sub',
attributes: ['*'] // Fetch all attributes
}
};
function searchLDAPByUserPrincipalName(userPrincipalName, callback) {
const client = ldap.createClient({
url: ldapConfig.url
});
console.log('Connecting to LDAP server...');
client.bind(ldapConfig.bindDN, ldapConfig.bindCredentials, (err) => {
if (err) {
console.error('Bind error:', err);
return callback(err);
}
console.log('Bind successful');
const opts = {
...ldapConfig.searchOptions,
filter: `(&(objectClass=person)(userPrincipalName=${userPrincipalName}))`
};
client.search(ldapConfig.searchBase, opts, (err, res) => {
if (err) {
console.error('Search error:', err);
client.unbind();
return callback(err);
}
let user = null;
res.on('searchEntry', (entry) => {
console.log('Entry found:', JSON.stringify(entry.object, null, 2));
user = entry.object;
});
res.on('searchReference', (referral) => {
console.log('Referral:', referral.uris.join());
});
res.on('error', (err) => {
console.error('Search entry error:', err);
client.unbind();
return callback(err);
});
res.on('end', (result) => {
console.log('Search end status:', result.status);
client.unbind();
if (result.status !== 0) {
return callback(new Error(`Non-zero status from LDAP search: ${result.status}`));
}
callback(null, user);
});
});
});
}
// Example usage
searchLDAPByUserPrincipalName('[email protected]', (err, user) => {
if (err) {
console.error('LDAP search failed:', err);
} else {
console.log('User found:', user);
}
});```
当我运行此代码时,我希望在日志中看到用户详细信息。但是,我得到以下日志输出:
my-form\src> node server.js
Connecting to LDAP server...
Bind successful
Entry found: undefined
Search end status: 0
User found: undefined
我可以看到 LDAP 连接和绑定成功,并且搜索选项看起来正确。但是,找到的条目和找到的用户日志显示未定义。
到目前为止我尝试过的:
仔细检查 ldapConfig 值以确保它们正确。 已验证正在搜索的 userPrincipalName 是否存在于目录中。 记录搜索选项以确认它们包含正确的过滤器和属性。 尽管执行了这些步骤,仍然无法获取用户信息。谁能帮助我理解为什么用户返回未定义以及如何修复它?
我用这个解决了我的问题:
let parsed = {};
if (entry.object) {
parsed = entry.object;
} else if (entry.attributes) {
entry.attributes.forEach(attr => {
parsed[attr.type] = attr.vals;
});
}
return parsed;
}