【问题标题】:Are there any best practices for exposing resource permissions/ACL to a front end via a RESTful API?是否有通过 RESTful API 向前端公开资源权限/ACL 的最佳实践?
【发布时间】:2013-10-21 12:50:18
【问题描述】:

这个问题几乎涵盖了它。给定一个 RESTful API,我们有多种资源类型和各种用户权限,围绕谁可以对它们进行 CRUD,是否有任何既定的最佳实践可以将这些权限公开给前端,这样权限就不必存储在两个地方?

我有一个纯 JS 应用程序,我需要知道例如何时显示给定资源的编辑和删除链接。我想要一种直接基于存储在后端的 ACL 做出这些决定的标准方法。我考虑过可能在 REST 信封中为所有 GET 响应带回 ACL 部分,但我希望也许有人知道已建立的最佳实践。

不管怎样,我也在使用 Symfony2 及其安全组件。

【问题讨论】:

    标签: rest symfony restful-architecture


    【解决方案1】:

    在纯 RESTful 场景中,客户端根本不会管理 ACL。相反,当客户端请求信息时,返回的资源将包括从这些资源到客户端可以遵循的可能链接的链接。这样,服务器就可以告诉客户端使用给定资源可以做什么和不可以做什么(具体到谁在请求它)。

    示例:您的 JS 客户端检索已购买但尚未发货的商品的 JSON 有效负载。客户端可能会收到如下所示的有效负载:

    {
      "name": "Gadget 1",
      "price": "16.99",
      "status": "ORDERED",
      "_links": {
        "details": { "href": "/item/a631723d69/details",
                     "method": "GET"),
        "cancel-shipment": {  "href": "/item/a631723d69",
                     "method": "DELETE" }
      }
    }
    

    由于服务器返回了cancel-shipment链接关系,表示订单中的商品目前允许取消。但是想象一下资源在发货后几天后发出请求后的样子:

    {
      "name": "Gadget 1",
      "price": "16.99",
      "status": "SHIPPED",
      "_links": {
        "details": { "href": "/item/a631723d69/details",
                     "method": "GET")
      }
    }
    

    cancel-shipment 链接关系将不再从服务器返回,因为它不再是一个允许的操作(即,您不能在发货后取消订单)。

    可以以相同的方式管理更传统的访问控制(即,不要将取消发货链接发送给未经授权的用户)。假设订单尚未发货,您的配偶可以看到您订购的商品,但不允许取消订单。他们会拿回来的:

    {
      "name": "Gadget 1",
      "price": "16.99",
      "status": "ORDERED",
      "_links": {
        "details": { "href": "/item/a631723d69/details",
                     "method": "GET")
      }
    }
    

    因此,总而言之,每个响应中返回的链接封装并表示请求者在系统中的任何给定时刻被授权执行的操作。

    在任何情况下,您必须检查服务器上的适当授权以处理所发出的请求,因为您永远不知道何时有人可能会使用原始 URL 进行攻击。

    【讨论】:

    • 啊,这是一个很好的观点。我没有考虑将客户端策略仅基于返回的链接。事后看来这是相当明显的......谢谢!
    • @Jonathan W:同理,您认为根据授权用户的权限修改 Order 对象的实际结构是否有效?例如,如果我的妻子可以看到我订购的商品,但不应该看到我为此支付了多少钱,那么您认为返回没有 price 属性的订单对象是否有效?
    • “Order 对象的实际结构”是什么意思?您的意思是根据您的身份返回 Order 资源的不同表示吗?您可以这样做,但请记住,这会破坏您有效缓存资源的能力。 (而且,正如已经向我指出的那样,我对这个问题的回答也是如此。)
    猜你喜欢
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 2014-08-15
    • 2013-03-14
    相关资源
    最近更新 更多