【问题标题】:Permissions to a nested resource in REST APIREST API 中嵌套资源的权限
【发布时间】:2019-04-12 11:46:00
【问题描述】:

背景

考虑拥有 3 个资源:reportscommentsattachmentsreport 可以有多个commentscomment 可以有多个attachments

此外,附加到特定report(在报告->评论->附件树中)的attachments只能由具有特定report权限的用户访问。

问题

现在,我在设计 REST API 时喜欢扁平 URL 结构,但在上述情况下,我不知道如何在不创建很长的资源的情况下做到这一点:

/reports/:id/comments/:id/attachments/:id

有什么方法可以满足这些要求(权限)并能够从/attachments/:id 这样的平面网址访问attachment

或者我夸大了,拥有这些长资源 URL 完全没问题?

免责声明:我创建了一个 attachments 资源(而不是 report-attachments),因为还有其他资源也需要 attachments - 我不想复制该结构。 em>

【问题讨论】:

    标签: rest api permissions api-design


    【解决方案1】:

    拥有这些长资源 URL 完全没问题?

    拥有任何类型的资源 URL 都是完全可以的。 REST 不在乎您如何拼写资源标识符——这就是重点。因此,如果您需要一个日志 URL,因为服务器需要将大量信息编码到其中,那很好。

    如果担心长度,可以去掉语义提示

    /reports/:id/comments/:id/attachments/:id
    /reports/:id/c/:id/a/:id
    /reports/:id/:id/:id
    /:id/:id/:id
    

    对于您在服务器上使用的 routing 框架,其中一些拼写会更容易,但这是您可以控制的实现细节。

    没有规定必须将信息直接编码到标识符中; URL 缩短器工作

    在 HTML 中,我们还可以通过表单从客户端提供的信息中构造(某些)标识符。这是因为 HTML 媒体类型的定义包含处理规则,这些处理规则描述了如何将表单数据组装成包含在查询部分中的 application/x-www-form-urlencoded 表示。

    因此您可以在自己的媒体类型中引入类似的机制。

    还有RFC 6570,它描述了URI 模板。这为您提供了另一种与客户端通信的方式,即如何将信息编码到 URL 中。

    有什么方法可以满足这些要求(权限)并能够从像 /attachments/:id 这样的平面 URL 访问附件?

    当然。您只需要能够使用:id 查找/计算正确的权限集,然后检查请求以查看权限是否满足。

    【讨论】:

    • 感谢您的详尽回答! :) 与此同时,我意识到我可以计算/attachments/:id 端点上的权限,但这需要查看父母。长期的方式会更容易实现。不管怎样,你给了我足够多的选择,所以我觉得我的问题已经得到解答!
    猜你喜欢
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多