【问题标题】:Role based authorization with express-jwt?使用 express-jwt 进行基于角色的授权?
【发布时间】:2016-07-20 07:47:00
【问题描述】:

我正在使用 express-jwt 来保护我的 API 端点,以便只有经过身份验证的用户才能访问我的 API。现在我还想根据用户的角色保护我的 API。例如,如果用户是管理员,则只能访问某些 API,如果他们是超级管理员,则只能访问其他一些 API,等等。我该如何实现呢?我在 express-jwt github doc 中找到了这段代码 sn-p:

app.get('/protected',
  jwt({secret: 'shhhhhhared-secret'}),
  function(req, res) {
    if (!req.user.admin) return res.sendStatus(401);
    res.sendStatus(200);
  });

看起来这段代码正在 API 控制器功能中进行授权。这是唯一且推荐的方法吗?有没有更好的方法来做到这一点?有关于此的最佳做法的任何建议?

【问题讨论】:

    标签: node.js express express-jwt


    【解决方案1】:

    这是唯一且推荐的方法吗?

    差不多,是的。

    不过,这不是“控制器功能”。这是一个中间件的例子,这就是你想在这种情况下使用的。

    一个更完整的例子是:

    
    var router = new express.Router();
    
    // process jwt stuff
    var processjwt = jwt({secret: 'shhhhhhared-secret'});
    
    // authorization check
    function authorizationCheck(req, res, next) {
      if (!req.user.admin) { 
       return res.sendStatus(401);
      } else {
        // move to the next middleware, cause it's ok
        next();
      } 
    }
    
    // the real route handler
    function myRouteHandler(req, res){
      doSomeWork(function(err, data){
        if (err) { return next(err); }
        res.json(data);
      });
    }
    
    // put it all together
    router.use("/protected", processjwt, authorizationCheck);
    router.get("/protected", myRouteHandler);
    

    可以使用此设置的数十种变体,但这可以理解。

    【讨论】:

    • 您能否详细介绍一下您通常如何进行授权?特别是,例如,我有 3 个用户角色,超级管理员、管理员和用户以及 10 个 API 端点,为了简单起见,我们将它们称为 API 1、API 2、... API 10。如果我只想让超级管理员怎么办?和管理员可以访问 API 1 -> API 3,只有超级管理员和用户可以访问 API 4 -> API 6,而其他所有经过身份验证的用户都可以使用?我能想到的解决方案是编写 2 个中间件处理程序,一个用于 API 1 -> API 3,另一个用于 API 4 -> API 6。你的是什么?
    • 这是否意味着角色信息存储在令牌中?
    猜你喜欢
    • 1970-01-01
    • 2017-12-14
    • 2018-04-17
    • 2020-07-09
    • 2017-06-24
    • 2018-12-05
    • 2018-11-01
    • 2020-11-29
    • 2019-09-17
    相关资源
    最近更新 更多