Node.js 验证Passport.js中的访问/组
我想使用passport.js来验证当用户点击某些端点时,他们不仅拥有正确的密码,而且是特定组的成员或具有特定访问权限 为了简单起见,如果我有用户和管理员的访问级别 我可以使用passport验证密码: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.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) {
});