Node.js 验证Passport.js中的访问/组

Node.js 验证Passport.js中的访问/组,node.js,passport.js,Node.js,Passport.js,我想使用passport.js来验证当用户点击某些端点时,他们不仅拥有正确的密码,而且是特定组的成员或具有特定访问权限 为了简单起见,如果我有用户和管理员的访问级别 我可以使用passport验证密码: passport.use(new LocalStrategy( function(username, password, done) { User.findOne({ username: username }, function(err, user) { if (err)

我想使用passport.js来验证当用户点击某些端点时,他们不仅拥有正确的密码,而且是特定组的成员或具有特定访问权限

为了简单起见,如果我有用户和管理员的访问级别

我可以使用passport验证密码:

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, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));
然后通过路由,我可以确保用户通过身份验证:

app.get('/api/users',
  passport.authenticate('local'),
  function(req, res) {
    res.json({ ... });
  });
但是假设您需要有管理员权限才能点击/api/users。我需要写我自己的策略吗?IE我是否需要有一个本地用户和本地管理策略,并在每个策略中验证正确的访问级别

我想我可以很容易地做到这一点,但当我需要我的站点有不同的身份验证方法(可能有时使用oauth)时,问题就出现了,我需要为每个方法编写自定义的*-用户*-管理策略。看起来太过分了

另一个选项是在用户经过身份验证后,只验证每个路由中的访问/组。但如果可能的话,我更愿意在中间件中实现这一点


谢谢

您可以创建一个简单的中间件来检查组:

这假设存储在
req.user
中的对象具有属性
。此对象是从策略实现和
反序列化用户
传递的对象

另一种可能是,但我不知道它与Passport的集成程度如何

编辑:您还可以将Passport和组检查中间件结合使用:

var needsGroup = function(group) {
  return [
    passport.authenticate('local'),
    function(req, res, next) {
      if (req.user && req.user.group === group)
        next();
      else
        res.send(401, 'Unauthorized');
    }
  ];
};

app.get('/api/users', needsGroup('admin'), function(req, res) {
});

哦,我明白了。看起来您可以使用一组“中间件”函数,这些函数按顺序通过express调用。甚至没有意识到,一定是错过了。再次阅读手册的时间;)谢谢,这太完美了!是的,就是这样:'app.VERB(路径,[callback…],callback')。很抱歉我错过了,谢谢你的回答!我正在寻找的是一个可选的身份验证:我知道这是超级挑剔的,但我认为403可能更适合于这种情况下的响应。身份验证已通过passport,所以实际上这是一个未经授权的请求。我的问题是我的角色是动态的,从后端api如何处理这种情况下的任何建议??
var needsGroup = function(group) {
  return [
    passport.authenticate('local'),
    function(req, res, next) {
      if (req.user && req.user.group === group)
        next();
      else
        res.send(401, 'Unauthorized');
    }
  ];
};

app.get('/api/users', needsGroup('admin'), function(req, res) {
});