Подтвердить что ты не робот

Проверить доступ/группу в 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 стратегии для каждого. Похоже на перебор.

Другой вариант - просто проверить доступ/группу на каждом маршруте после аутентификации пользователя. Но я предпочел бы сделать это в средстве, если это возможно.

Спасибо

4b9b3361

Ответ 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) {
});