如何在 passport js 中授权 API(设置只能访问某些特权类型用户的 API)?

How to Authorize APIs in passport js ( Set up APIs that can only accessible some privileged type of users)?

我一直在使用 passport js 进行 API 身份验证。现在我必须编写只能由某些特权类型的用户访问的 APIs。(对于供应商,管理员 only.Some 可以访问某些 APIs)。在用户模型中,我指定了每个用户的角色(如果用户是管理员、供应商或客户)。

我已经使用 "drop-wizard-auth" 解决了放置向导中的类似问题。

如果用户没有权限访问 API 它应该显示错误 403

请分享link或建议可以解决我的问题。

试试这个解决方案:

在模型用户中,您有 "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
);