Express 中间件授权

Express 中间件授权,express,authorization,middleware,koa,Express,Authorization,Middleware,Koa,我有一个应用程序需要根据请求用户和请求资源之间的关系进行授权。访问详细信息封装在要请求的资源中 让我们采取路径补丁/articles/1:这篇文章有一位作者/所有者和一组编辑,他们都有权更新这篇文章。请求用户经过身份验证,可以是作者或其中一个编辑器。否则,应拒绝访问 -- 我有两个想法: 中间件中的授权: 这意味着,在控制器能够聚合资源之前,中间件就已经需要资源了。但是,有时(例如,在使用MongoDB聚合框架时),控制器将无法重用资源,并且需要另一次到数据库的往返 控制器中的授权: 一旦资源可

我有一个应用程序需要根据请求用户和请求资源之间的关系进行授权。访问详细信息封装在要请求的资源中

让我们采取路径
补丁/articles/1
:这篇文章有一位作者/所有者和一组编辑,他们都有权更新这篇文章。请求用户经过身份验证,可以是作者或其中一个编辑器。否则,应拒绝访问

--

我有两个想法:

  • 中间件中的授权
    这意味着,在控制器能够聚合资源之前,中间件就已经需要资源了。但是,有时(例如,在使用MongoDB聚合框架时),控制器将无法重用资源,并且需要另一次到数据库的往返

  • 控制器中的授权:
    一旦资源可用/聚合,就可以在控制器中执行授权。但这将把这部分授权与身份验证和基于角色的访问控制分开,我已经将其作为中间件准备好了

  • 我个人认为中间件方法更有意义,但数据库将由另一个PaaS托管,即使在同一个数据中心内,也可能会有一些延迟

    如果请求了相关资源(例如注释),该怎么办?这将涉及一些特定的逻辑,这些逻辑来自存储访问详细信息的文章的注释。并且会使我的auth中间件更不通用

    --

    还有其他选择吗

    --

    应用程序使用,但这些概念可能适用于支持框架的所有其他中间件,例如或其他中间件


    请注意,我不是在询问身份验证或经典的基于角色的访问,例如。

    我的正常模式是使用路由参数从数据库获取资源,例如:

    app.param("articleId", function (req, res, next, paramValue) {
      var _id;
      try {
        _id = new ObjectID(paramValue);
      } catch (error) {
        res.status(400).send('Invalid ID');
        return;
      }
      Article.findById(_id, function(error, doc){
        if (error) {
          next(error);
          return;
        }
        if (doc) {
          req.article = doc;
          next();
          return;
        }
        res.send(404);
      });
    });
    
    然后我使用一个中间件进行授权,但它可以假设
    req.article
    已经从数据库中加载

    这是一个很好的默认模式,我认为您应该使用它一段时间,并在进行任何性能优化之前习惯它,但是当您确实有足够的流量来选择一个不太通用的模式时,就尝试一下。请记住,这通常在创业/项目的第二年或第三年是合理的,而不是在启动日。

    谢谢,听到这个消息很高兴:)这也是正确的。但有一件事:如果我的路线在相关资源(例如
    评论
    )上工作,但访问详细信息在
    故事
    中,该怎么办?我需要预先获取注释,然后(MongoDB)将它们附加到请求对象。在这种情况下,您是否也有多种不同的方法(
    attach
    attachThroughComments
    ,…)?