验证 Passport.js 中的访问权限/组
Posted
技术标签:
【中文标题】验证 Passport.js 中的访问权限/组【英文标题】:Verify access/group in Passport.js 【发布时间】:2013-03-21 02:11:39 【问题描述】:我想使用 passport.js 来验证当用户点击某些端点时,他们不仅拥有正确的密码,而且是特定组的成员或具有特定的访问权限。
为了简单起见,如果我有 USER 和 ADMIN 的访问级别。
我可以使用护照来验证密码:
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)时,问题就出现了,我需要为每个方法编写自定义的 *-user、*-admin 策略。看起来有点矫枉过正。
其他选项是在用户通过身份验证后仅验证每个路由中的访问/组。但如果可能,我更愿意在中间件中执行此操作。
谢谢
【问题讨论】:
【参考方案1】:您可以创建一个简单的中间件来检查组:
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
传递过来的。
替代方案可能是connect-roles,但我不知道它与 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(path, [callback...], callback)'。对不起,我错过了,感谢您的回答如此友好! 我正在寻找的是可选身份验证:***.com/questions/25806339/… 我知道这很挑剔,但我认为 403 可能更适合这种情况下的响应。那时身份验证已通过护照通过,因此确实是未经授权的请求。 我的问题是我的角色是动态的后端 api 如何在这种情况下处理任何建议??以上是关于验证 Passport.js 中的访问权限/组的主要内容,如果未能解决你的问题,请参考以下文章
Passport.js:LocalStrategy 如何访问用户信息?
使用 Passport.js 的 Vue.js 客户端和 Express.js 服务器的完整 Oauth2 身份验证流程