validationPassport.js中的访问/组

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

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

我可以使用护照来validation密码:

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

然后用一个路线,我可以确保用户通过身份validation:

 app.get('/api/users', passport.authenticate('local'), function(req, res) { res.json({ ... }); }); 

但是,让我们说你需要有一个ADMIN访问/ api / users'。 我需要写我自己的战略吗? IE我需要一个本地用户和本地pipe理策略,并在每个validation正确的访问级别?

我想我可以很容易地做到这一点,但是当我需要我的网站有不同的auth方法(可能有时使用oauth)时,问题就出现了,我需要为每个方法编写自定义的* -user,* -admin策略。 看起来像矫枉过正。

其他选项是在用户通过authentication之后,在每个路由中只validation访问/组。 但是如果可能的话,我宁愿在中间件中这样做。

谢谢

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

 var needsGroup = function(group) { return function(req, res, next) { if (req.user && req.user.group === group) next(); else res.send(401, 'Unauthorized'); }; }; app.get('/api/users', passport.authenticate('local'), needsGroup('admin'), function(req, res) { ... }); 

这假定存储在req.user中的对象有一个属性group 。 这个对象是从策略实现和deserializeUser传递来的。

替代scheme可能是连接angular色 ,但我不知道如何与护照集成。

编辑:你也可以结合护照和组检查中间件:

 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) { });