Как авторизовать API-интерфейсы в паспорте js (настроить API-интерфейсы, которые могут получить доступ только для некоторых привилегированных типов пользователей)? - PullRequest
0 голосов
/ 31 октября 2019

Я работал над аутентификацией API с использованием паспорта js. Теперь мне нужно написать API, которые могут быть доступны только некоторым привилегированным типам пользователей (некоторые API доступны только для администратора. Некоторые для поставщиков). В модели пользователя я определил роль каждого пользователя (если пользователь является администратором, поставщиком или клиентом).

Я решил аналогичную проблему в drop-wizard, используя «drop-wizard-auth».

Если у пользователя нет прав доступа к API, должно отображаться сообщение об ошибке-403

Пожалуйста, поделитесь ссылкой или сообщите, что может решить мою проблему.

  • Я использую Postgresql (для информации)
  • Стратегия - токен на предъявителя

1 Ответ

1 голос
/ 31 октября 2019

Попробуйте это решение:

У пользователей модели у вас есть поле "user_type", которое получает целые числа ниже.

// model for user 

module.exports = (sequelize, DataTypes) => {

let users = sequelize.define ('users', {

    id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true, field: 'id' },
    name: { type: DataTypes.STRING (50), field: 'name' },
    ..
    user_type: { type: DataTypes.INTEGER, field: 'user_type' } // 0 for admin, 1 for vendor, 2 for customer 
    },
});
 return users;
};

Следующая функция - это файл passport.js, который проверяет, что этоУ пользователя есть правильная роль для достижения этой конечной точки или нет.

passport.isAuthorized = ( userType ) => {
  return (req, res, next) => {
    if (userType == 0) { // mean its admin 
        if (req.user.user_type == 0) { // user value stored in req through deserialize fucntion
            return next(); // user has correct admin role
        } else {
          return next({ error: 'Please need admin level access to hit endpoint' 
         });
       }
    } else if (userType == 1) { // mean its vendor 
        if (req.user.user_type == 1) {
            return next(); // user has correct vendor role
        } else {
          return next({ error: 'Please need vendor level access to hit endpoint' 
        }
    } else if (userType == 2) { // mean its custumer
        if (req.user.user_type == 2) {
            return next(); // user has correct custumer role
        } else {
          return next({ error: 'Please need customer level access to hit endpoint' 
        }
    }
    return next({ error: 'something!went wrong.' });
  };
};

В файле маршрутов вам просто нужно добавить эти промежуточные программы.

app.post('baseURL/get-user-list',
    passport.isAuthenticated, // check user is authorized or not
    passport.isAuthorized(1), // check user role, if you want to check for admin pass 0, for vendor pass 1, for customer pass 2
    controllerUser.getUser
);
...