不同身份验证用户的同一资源的不同REST表示

不同身份验证用户的同一资源的不同REST表示,rest,Rest,我有这样一个简单的资源: /api/{configuration}/参展商/{id} 这通常是一个公共API,具体取决于URL配置部分的设置 它可能会将其返回给未经身份验证的用户: { "a" : "some value", "b" : "other value" } 但是,如果管理员登录并希望获取此资源,他们会希望在同一资源上获得一些稍微不同的数据: { "a" : "some value", "C" : "admin only value" } 我是否应该检测这个管理权限并从同一个URL

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

/api/{configuration}/参展商/{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”,因此我希望管理员表示形式稍微轻一点。

根据情况,两种选项都是可行的。正如您所提到的,允许在表示中进行更改将使缓存变得困难。但是,在支持不同的资源时会有额外的开销。理想情况下,您的服务器端框架可以轻松创建额外的资源,因此开销应该最小


另一个选项是返回公共版本,并提供指向仅包含附加“仅管理员”属性的资源的嵌入式超链接。如果你的客户能够轻松地处理超媒体,那么这将成为一个相当灵活的选择

我认为经过身份验证的用户应该是提供了用户id和密码(即登录)的人。用户登录后,大多数REST应用程序往往依赖cookie来确定请求是否来自经过身份验证的用户

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

出于安全原因,您确实不想在URL中泄露用户id。此外,用户id通常是用户的电子邮件或帐号

Admin是一种特殊情况,根据后端体系结构,可以实现一种允许Admin访问其他用户的管理信息的解决方案