如果用户已正确登录(已验证),我想为用户设置一些会话数据,例如,在数据库中查找用户并确定他的角色,可以看到应用程序的哪些部分,等等
但是,我想为dev / localhost和生产使用不同的护照策略。
因此,我根据不同的ENV设置插入不同的策略。
让我感到困扰的是,在用户正确认证之后,我在哪里放置公共代码,用于两种(任何)策略,即执行的(仅一次!)。
我不会将其嵌入策略并复制代码。
编辑:
示例:
说我的本地策略中有这个代码:
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (!user.verifyPassword(password)) {
<setup session data code here>
return done(null, false);
}
return done(null, user);
});
}
));
现在,在我的另一个策略中,我必须重复<setup session data code here>
。
我想将这部分代码移到我的两个策略之外,这样策略只会对用户进行身份验证。
我正在护照中寻找一些onSuccessfulAuthorization处理程序/事件,以便在授权成功后执行该代码,无论当前采用何种策略。
答案 0 :(得分:0)
有多种方法可以做到这一点。根据您的具体情况,您可以找到最适合您的方式。
如果您需要更多功能,我建议您使用其他文件session_setup.js
甚至common.js
。将您的公共代码作为函数放在那里,然后在需要时require
。
session_setup.js :
module.exports.setupSession = function (user) {
// put your common code here
}
在您的策略文件中:
let setupSession = require('./session_setup.js');
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (!user.verifyPassword(password)) {
setupSession(user); // you can pass whatever argument you need there.
return done(null, false);
}
return done(null, user);
});
}
));
如果setupSession
中的登录是异步的,您也可以接受回调参数,或者更好,在策略中返回Promise
:
if (!user.verifyPassword(password)) {
setupSession(user).then(() => {
done(null, false);
});
}
这完全取决于你在那段代码中实际做了什么。你明白了。