Проверить доступ/группу в Passport.js
Я хотел бы использовать 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);
});
}
));
Затем с помощью маршрута я могу убедиться, что пользователь передает auth:
app.get('/api/users',
passport.authenticate('local'),
function(req, res) {
res.json({ ... });
});
Но скажем, вам нужно иметь ADMIN acess для доступа /api/users. Нужно ли писать собственные стратегии? IE мне нужно иметь стратегию локального пользователя и локального администратора, и в каждой проверять правильные уровни доступа?
Я думаю, что я могу сделать это довольно легко, но проблема возникает, когда мне нужно, чтобы мой сайт имел разные методы auth (возможно, иногда использовал 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) {
});