是否有通过RESTful API将资源权限/ ACL暴露给前端的最佳实践?

Jas*_*lan 11 rest symfony restful-architecture

问题几乎涵盖了它.给定一个RESTful API,我们有多种资源类型和围绕谁可以CRUD的各种用户权限,是否有任何已建立的最佳实践将这些权限暴露给前端,以便权限不必存储在两个位置?

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

对于它的价值,我也使用Symfony2及其安全组件.

Jon*_*n W 13

在纯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" }
  }
}
Run Code Online (Sandbox Code Playgroud)

因为服务器返回的取消,发货链接关系,这意味着,在订单中的项目,允许被取消在当下.但想象一下资源在发货后可能会是什么样子,并在几天后提出请求:

{
  "name": "Gadget 1",
  "price": "16.99",
  "status": "SHIPPED",
  "_links": {
    "details": { "href": "/item/a631723d69/details",
                 "method": "GET")
  }
}
Run Code Online (Sandbox Code Playgroud)

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

可以以相同的方式管理更传统的访问控制(即,不将取消 - 发货链接发送给未授权的用户).假设订单尚未发货,您的配偶可以看到您订购的是什么,但不允许取消订单.他们得到了回报:

{
  "name": "Gadget 1",
  "price": "16.99",
  "status": "ORDERED",
  "_links": {
    "details": { "href": "/item/a631723d69/details",
                 "method": "GET")
  }
}
Run Code Online (Sandbox Code Playgroud)

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

在任何情况下,您都必须在服务器上检查是否有适当的授权请求,因为您永远不知道有人可能正在使用原始URL进行攻击.