Ролевая авторизация с NodeJS / Express - PullRequest
0 голосов
/ 26 ноября 2018

Я работаю над приложением NodeJS / express, используя PassportJS для входа / регистрации.Я определил модель пользователя для всех пользователей, но хочу, чтобы только некоторые пользователи в моей администрации имели доступ к редактированию определенных моделей.Я думал о добавлении логического поля, например isAdmin , чтобы определить это, но я не знаю, как я могу проверить пользователей с правами администратора.Если быть точным, как бы я определил, когда мне нужно сгенерировать токен для администратора?Как я могу отличить пользователей в моих администрациях от обычных пользователей?

Любая помощь будет принята с благодарностью!

Спасибо!

1 Ответ

0 голосов
/ 27 ноября 2018

Что вы можете сделать, это добавить это поле в полезную нагрузку JWT при входе в систему, а затем создать функцию промежуточного программного обеспечения, которая проверяет это в качестве второго параметра маршрута ...


Итак, давайтескажем, что это ваша схема User.js:

const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    minlength: 5,
    maxlength: 50
  },
  email: {
    type: String,
    required: true,
    minlength: 5,
    maxlength: 255,
    unique: true
  },
  password: {
    type: String,
    required: true,
    minlength: 5,
    maxlength: 1024
  },
  isAdmin: Boolean
});

Здесь вы генерируете токен JWT:


userSchema.methods.generateAuthToken = function() { 
  return jwt.sign({ _id: this._id, isAdmin: this.isAdmin }, config.get('jwtPrivateKey'));
}

Вотпромежуточное ПО для проверки истинности isAdmin:


module.exports = function (req, res, next) { 
  if (!req.user.isAdmin) return res.status(403).send('Access denied.');
  next();
}

И затем вы можете включить его в качестве второго аргумента в обработчик маршрута ... Так что для PUT это будет что-то вроде:


router.put('/:id', [auth, isAdmin, any other middleware...], async (req, res) => {
 // handle the route...
});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...