【问题标题】:Different REST representations of same resource for different authenticated users不同身份验证用户对同一资源的不同 REST 表示
【发布时间】:2013-07-08 23:32:48
【问题描述】:

我有一个类似这样的简单资源:

/api/{configuration}/exhibitors/{id}

这通常是一个公共 API,具体取决于 URL 配置部分的设置。

它可能会将此返回给未经过身份验证的用户:

{ "a" : "some value", "b" : "other value" }

但如果管理员已登录并想要获取此资源,他们会期望同一资源上的数据略有不同:

{ "a" : "some value", "C" : "admin only value" }

我是否应该检测此管理员权限并仅从同一 URL 返回不同的内容?

或者我应该有一个新的 URL 来标识它是为谁服务的并且内容可能不同?

/api/admin/{configuration}/exhibitors/{id}

我的想法是我不喜欢额外的 URL,但如果我不根据用户更改内容,我将更容易缓存公共内容。

没有理由管理员调用无法获取资源的完整公共版本以及额外的仅限管理员字段,但在我的示例中它们实际上可能不需要字段“b”,所以我宁愿管理员表示稍微轻松一些。

【问题讨论】:

    标签: rest


    【解决方案1】:

    视情况而定,这两种选择都是可行的。正如您所提到的,允许表示形式的变化将使缓存变得困难。但是,在支持不同的资源方面存在额外的开销。理想情况下,您的服务器端框架可以轻松创建额外资源,因此开销应该是最小的。

    另一个选项是返回公共版本并提供一个嵌入的超链接到仅包含附加“仅限管理员”属性的资源。如果您的客户可以轻松处理超媒体,那将成为一个相当灵活的选择。

    【讨论】:

      【解决方案2】:

      我想经过身份验证的用户将是提供用户 ID 和密码的人,即登录。用户登录后,大多数 REST 应用程序倾向于依靠 cookie 来确定请求是否来自经过身份验证的用户与否。

      理想情况下,每个用户都应该有自己的上下文。一个用户的 /tmp/foo 与另一个用户的 /tmp/foo 不同。您仍然可以拥有由以 /public 或类似名称开头的 URL 标识的公共内容。

      出于安全原因,您确实不想将用户 ID 作为 URL 的一部分泄露。此外,用户 ID 通常是用户的电子邮件或帐号。

      管理员是一种特殊情况,根据后端架构,可以实施允许管理员访问其他用户的管理信息的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-02
        • 1970-01-01
        • 1970-01-01
        • 2020-10-06
        • 1970-01-01
        • 2020-07-31
        相关资源
        最近更新 更多