宁静的网络服务,部分阅读权限

时间:2017-01-05 16:13:20

标签: rest crud

我正在设计一个安静的网络服务来创建和阅读应用程序生成的报告。在创建报告时,可以添加一些隐私敏感信息,如姓名,电话号码,邮件等。创建报告后,通过相同的Web服务公开显示报告。

POST /report
{
"name":"test",
"email":"test@example.com",
"report_contents":....
}

使用以下内容返回200 OK

{
 "id":1,
 "report_contents":....
} 

以及获得上述报告的方法:     GET / report / {report_id}

我有另一个应用程序,管理员可以使用该应用程序管理通过以前的Web服务创建的报告。在此应用程序中,我想显示隐私敏感信息。它使用以下URL来获取特定报告。

GET /report/{report_id}

返回200 OK:

 {
 "id":1,
 "name":"test",
 "email":"test@example.com",
 "report_contents":....
 } 

现在有问题了。这是完全相同的网址。对于两个呼叫都使用相同的Web服务是可能的/传统的,甚至是个好主意,但是对它进行某种CRUD管理,根据用户的角色,部分信息不会被显示/阻止?或者制作一个有限制的单独Web服务会更好吗?

2 个答案:

答案 0 :(得分:1)

如果您选择的语言支持它,您可以返回动态对象。

这里有一些伪代码。

if (loggedInUser != isAdmin(user))
   return new { id: 1, contents: "..." }
else 
   return new { id: 1, name: "test", email: "test@test.com", contents: "..." }

就个人而言,我会有不同的领域做不同的事情。一个为每个人检索模型的区域。在另一方面,它就像一个管理区域。

在一个区域,你有

答案 1 :(得分:1)

是的,对于不同的请求,可以在同一URL返回相同资源的不同表示。这就是内容协商的工作方式。

如果你担心这个问题,我可以考虑两个选择:

一个选项是包含一个查询参数,以明确选择视图,并且可以为每个视图控制访问。例如。

  • /report/{report_id}?view=full
  • /report/{report_id}?view=restricted

或者您也可以考虑两个子资源,一个名为/report/{report_id}/full,一个名为/report/{report_id}/restricted,然后您可以在用户没有正确权限时返回40x代码,并使用{ {1}}标题作为他们可以看到的地方的暗示。