gpt4 book ai didi

node.js - 验证 Passport.js 中的访问权限/组

转载 作者:IT老高 更新时间:2023-10-28 21:58:53 25 4
gpt4 key购买 nike

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

为了简单起见,如果我有 USER 和 ADMIN 的访问级别。

我可以使用 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)时,问题就出现了,我需要为每个方法编写自定义的 *-user、*-admin 策略。看起来有点矫枉过正。

其他选项是在用户通过身份验证后仅验证每个路由中的访问/组。但如果可能,我更愿意在中间件中执行此操作。

谢谢

最佳答案

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

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

关于node.js - 验证 Passport.js 中的访问权限/组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15719116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com