如何使用具有不同策略的passport.js正确初始化会话数据?

时间:2017-01-27 15:19:12

标签: passport.js

如果用户已正确登录(已验证),我想为用户设置一些会话数据,例如,在数据库中查找用户并确定他的角色,可以看到应用程序的哪些部分,等等

但是,我想为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处理程序/事件,以便在授权成功后执行该代码,无论当前采用何种策略。

1 个答案:

答案 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); 
   });
}

这完全取决于你在那段代码中实际做了什么。你明白了。