我的简单express.js REST-API通过公司范围的LDAP服务器进行身份验证。我正在使用trentm的node-ldapauth module为什么node-ldapauth如此缓慢,即使缓存?
实际的问题是:当我使用一个简单的函数直接比较用户名和密码与提供的测试值时,浏览器中的响应大概在8到15 ms的范围内完成。这包括调用MongoDB获取数据(这个测试不多)。
如果我使用缓存({cache:true})的ldapauth.authenticate函数,它需要80到100毫秒。从代码中,我只能看到它检查一个LRU缓存,当然,第一个请求会比较慢,因为它实际上是在检查LDAP服务器,但后来呢?
下面是从应用一个小片段:
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
var ldap = new LdapAuth({
url: config.ldap.url,
adminDn: config.ldap.adminDn,
adminPassword: config.ldap.adminPassword,
searchBase: config.ldap.userBase,
searchFilter: config.ldap.userFilter,
cache: true
});
app.enable('trust proxy');
app.use(express.json());
app.use(express.urlencoded());
app.use(checkUrl);
app.use(express.basicAuth(function(user, pass, callback) {
// if(user === 'samuel' && pass === 'supertest') {
// callback(null, {name: 'samuel'});
// } else {
// callback(new Error("Unauthorized"));
// }
ldap.authenticate(user, pass, function(err, user) {
if(err) {
console.log("LDAP auth error: %s %s", err, err.dn);
callback(err);
}
callback(err, user);
});
}));
任何提示赞赏。
非常感谢你对这个很好的解释。我明白其背后的原因,但除了可能对我们的内部应用程序有点矫枉过正之外,时间约束对于此应用程序来说是完全不可接受的。 Java中的'参考实现'只会将返回的用户从LDAP中逐出并每分钟重新进行身份验证,所以不需要任何哈希,因为它不记住密码。我可能需要在这里实现相同的功能。 – smlgbl