【问题标题】:Role-Based Authorization with NodeJS/Express使用 NodeJS/Express 进行基于角色的授权
【发布时间】:2018-11-26 20:16:57
【问题描述】:

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

任何帮助将不胜感激!

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 如何确定何时生成身份验证令牌?我只希望我组织中的成员能够拥有管理员访问权限。
    • 您现在是如何处理注册和登录的?
    • 目前,所有用户都可以使用自己的 Google 帐户登录。 (我正在使用 PassportJS)
    • 最好事先知道...为了获得更具体的答案,您需要为您的项目提供相关代码,但想法是一样的...包括 isAdmin模式和一个中间件,用于检查登录 isAdmin 的人是否被传递给路由处理程序......
    • 那仍然没有回答我的问题。我如何确定何时需要生成令牌?如何区分管理中的用户和普通用户?
    猜你喜欢
    • 2016-07-20
    • 2021-05-23
    • 1970-01-01
    • 2012-08-28
    • 2018-11-14
    • 2022-01-01
    • 1970-01-01
    • 2017-12-14
    相关资源
    最近更新 更多