使用NodeJS / Express进行基于角色的授权

时间:2018-11-26 20:16:58

标签: node.js express mongoose authorization passport.js

我正在使用ElephantJS进行NodeJS / express应用程序的登录/注册。我已经为所有用户定义了一个用户模型,但是只希望管理中的某些用户有权编辑某些模型。我当时想添加一个布尔型字段(例如 isAdmin )来确定这一点,但是我不知道如何验证管理员用户。具体来说,如何确定何时需要为管理员用户生成令牌?我该如何区分管理中的用户和普通用户?

任何帮助将不胜感激!

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以做的是在登录时将字段添加到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...
});