我目前正在开发一个带有MongoDB后端的REST,并且由于访问权限的关系,客户端可能会查找一些可以访问的数据,而另一些数据是禁止的。
例如,假设我希望在一个请求对象A、B和X中有来自数据库的对象,但我没有足够的权限访问对象X。
我希望我的API回答A,B,以及对象X的禁止状态。有best-practices可以这样做吗?生成的请求状态代码是什么?
发布于 2020-02-26 14:49:34
当用户试图使用其URI检索单个资源的表示而用户没有足够的权限访问此类资源时,服务器将返回403。或者404,以防服务器想隐藏该资源的存在。
另一方面,在用户获取资源集合的表示而由于缺乏权限而不能返回所有可用资源的情况下,服务器应该只返回用户可以访问的资源的表示形式。
如果打算限制对资源字段的访问,则可以为它们设置不同的URI,然后相应地验证权限。
请考虑以下示例:
/orders/{id}:给定order/orders/{id}/items:项目的摘要给定order/orders/{id}/payment:的付款细节给定的order/orders/{id}/invoice:发票的细节给定的order/orders/{id}/delivery:交付的细节给定订单的发布于 2020-02-26 15:07:49
您可以为每个子资源使用信封,并向每个子资源添加状态。
假设您的API返回一个主资源A,后者又包含两个子资源B和X。如果调用方没有访问A的权限,那么API应该明确地使用HTTP/403响应,就像cassiomolin指出的那样。
如果调用方拥有对所有资源的完全权限,则示例响应将为(假设JSON有效负载):
{
"entityEnvelopeA": {
"status": "OK",
"data": {
"propertyΑ1": "value1",
"propertyΑ2": "value2"
}
},
"entityEnvelopeΒ": {
"status": "OK",
"data": {
"propertyΒ1": "value1",
"propertyΒ2": "value2"
}
},
"entityEnvelopeΧ": {
"status": "OK",
"data": {
"propertyΧ1": "value1",
"propertyΧ2": "value2"
}
}
}如果调用方无法访问子资源X,则响应为:
{
"entityEnvelopeA": {
"status": "OK",
"data": {
"propertyΑ1": "value1",
"propertyΑ2": "value2"
}
},
"entityEnvelopeΒ": {
"status": "OK",
"data": {
"propertyΒ1": "value1",
"propertyΒ2": "value2"
}
},
"entityEnvelopeΧ": {
"status": "FORBIDDEN",
"data": {}
}
}如果在您的API文档中记录了这种方法,那么调用方可以在解析status字段之前检查信封的data字段。
https://stackoverflow.com/questions/60416301
复制相似问题