Node.js RESTAPI URI是否应该基于参数而不仅仅是资源进行授权?

Node.js RESTAPI URI是否应该基于参数而不仅仅是资源进行授权?,node.js,rest,express,design-patterns,architecture,Node.js,Rest,Express,Design Patterns,Architecture,我正在尝试为我的web应用程序创建后端。该应用程序应该有能够创建关于不同事物的帖子并编辑这些帖子(如果需要)的用户,以及能够编辑甚至删除不同用户的帖子(如果他们认为这些帖子不好)的管理员。我在管理用户权限和授权方面遇到困难,特别是关于允许用户访问的资源,但我找到了两种可能的解决方案,我不确定哪一种是最好的 使用特定的路由(如/users/me),允许用户修改自己的数据,并将/users/{id}资源留给管理员使用 根据给定id是否与身份验证中的用户匹配来处理授权(/users/{id}仅允许您删

我正在尝试为我的web应用程序创建后端。该应用程序应该有能够创建关于不同事物的帖子并编辑这些帖子(如果需要)的用户,以及能够编辑甚至删除不同用户的帖子(如果他们认为这些帖子不好)的管理员。我在管理用户权限和授权方面遇到困难,特别是关于允许用户访问的资源,但我找到了两种可能的解决方案,我不确定哪一种是最好的

  • 使用特定的路由(如/users/me),允许用户修改自己的数据,并将/users/{id}资源留给管理员使用
  • 根据给定id是否与身份验证中的用户匹配来处理授权(/users/{id}仅允许您删除放置,前提是您与基于身份验证令牌的URI中的用户相同)
  • 我想从数据库交互层抽象身份验证和授权层,但我发现使用第二种方法非常困难,因为在用户访问资源之前检查用户是否“拥有”资源需要您检索该资源,但我还认为第二种方法也有一些优点

    在代码扩展和质量方面,哪一个是最好的架构选择,对于一个项目,您会选择哪一个(甚至可能是两者的混合)


    我提到我的后端使用node.jsexpress,它们通过Mongoose

    MongoDB数据库交互,我在您的第二个模型中做了大量工作,表单的端点中有很多逻辑“这个用户可以在某个对象上执行该操作吗”

    如果这些条件成立的话,我会推荐你的第一款

  • 用户可以对自己的数据执行的操作没有特权用户对任何用户执行的操作复杂

  • 您可以提出允许某种程度的代码重用的模型(用MVC术语)

  • API操作的最大份额将是用户操纵自己的数据

  • 为什么我建议你的第一个选择

    • 可测试性。最终用户处理自己数据的一组简单的API操作可以进行测试和回归测试,比依赖于更复杂的特权内容的一组更复杂的API更便宜

    • 可伸缩性。如果你的应用扩展,你可以将你的管理web端点移动到他们自己的一台或多台服务器上,并将更简单但流量更大的用户端点留在另一批服务器上。要使最后一批服务器起作用,你不需要像
      /users/me/where
      /users/{id}这样的端点/无论什么
      ,而是
      /me/whatever
      /users/{id}/whatever
      。不要给
      /me
      端点任何方式,让用户(可能是恶意网络爬虫)指定当前用户会话令牌或凭据以外的用户

    • 安全性。性能较差的端点集比性能较好的端点集更容易保护。接受较少数据项的端点本质上更安全。(当然,您仍然需要保护管理端点。)


    如果希望API是RESTful和一致的,那么应该使用第二个选项

    在REST中,资源由URL标识。像
    /users/me
    这样的URL意味着一个全局唯一的资源,事实证明并非如此

    另一种选择是更好地与REST保持一致。像
    /users/1234
    这样的URL表示与
    /users/5678
    不同的资源。据我所知,这实际上也是您所追求的行为

    从代码可维护性的角度来看,将模型与所需的行为对齐通常是值得的

    这使您能够