在纯 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 进行攻击。