对资源具有复杂权限的 REST
REST with complex permissions over resources
背景
我在设计和实施 REST 服务时遇到了问题,该服务发布了某些用户无法查看的内容(医疗信息,您知道,国家法律),我使用的是 ABAC-like/RBAC 系统保护它们,但让我担心的是我可能违反了 REST 模式。我的服务对每个查询执行以下过程:
- 安全中间件从 session 读取令牌,app/webpage 使用授权 header 或 cookie 发送令牌。
- ABAC/RBAC 应用规则以了解用户是否可以访问资源。
- 授权令牌后,我的服务执行查询并过滤结果,隐藏请求用户看不到的内容(如果需要。POST,PUT 和 DELETE 操作几乎可以免除此步骤)。过滤器是使用 ABAC/RBAC 规则完成的。
- 操作报告存储在日志中。
我已经知道 sessions 违反了 REST 模式,但我可以使用 BASIC/DIGEST 授权来替换它。我真正的问题如下:
问题
在 list/retrieve 操作中隐藏资源是否违反了 REST 模式?据我所知,REST 是无状态的,所以……如果我使用一些上下文变量来过滤我的结果(用户 ID)会怎样?我违反了 REST 吗?完全没有?
如果我这样做,你有什么建议?如何在不破坏 REST 约定的情况下实现它?
如果用户无权访问资源,我建议返回状态代码 401(未授权)。如果您无法确认资源是否存在,则返回 404(未找到)。
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.4
GET 意味着 return 资源的 表示。它没有说你必须return你所知道的关于该资源的一切。
return 表示的确切内容将取决于请求 headers。例如,您可以 return JSON 或 XML,具体取决于客户的请求。扩展这种思路;在不违反 REST 原则的情况下,return 可以根据客户端的身份验证对资源进行不同的表示。
首先,客户端会话根本不违反 REST。 REST 表示客户端和服务器之间的通信必须是无状态的,换句话说,服务器不应该要求任何请求本身不可用的信息来正确响应它。如果客户端保持会话并发送每个请求所需的所有信息,那很好。
关于您的问题,根据经过身份验证的用户更改响应并没有错。 REST 是一种架构风格,它试图将 Web 本身背后的成功设计决策应用到软件开发中。当您登录到 Stack Overflow 时,您看到的个人资料与我看到的不同,即使我们都使用相同的 URI,对吗?这就是 REST 应该如何工作的。
背景
我在设计和实施 REST 服务时遇到了问题,该服务发布了某些用户无法查看的内容(医疗信息,您知道,国家法律),我使用的是 ABAC-like/RBAC 系统保护它们,但让我担心的是我可能违反了 REST 模式。我的服务对每个查询执行以下过程:
- 安全中间件从 session 读取令牌,app/webpage 使用授权 header 或 cookie 发送令牌。
- ABAC/RBAC 应用规则以了解用户是否可以访问资源。
- 授权令牌后,我的服务执行查询并过滤结果,隐藏请求用户看不到的内容(如果需要。POST,PUT 和 DELETE 操作几乎可以免除此步骤)。过滤器是使用 ABAC/RBAC 规则完成的。
- 操作报告存储在日志中。
我已经知道 sessions 违反了 REST 模式,但我可以使用 BASIC/DIGEST 授权来替换它。我真正的问题如下:
问题
在 list/retrieve 操作中隐藏资源是否违反了 REST 模式?据我所知,REST 是无状态的,所以……如果我使用一些上下文变量来过滤我的结果(用户 ID)会怎样?我违反了 REST 吗?完全没有?
如果我这样做,你有什么建议?如何在不破坏 REST 约定的情况下实现它?
如果用户无权访问资源,我建议返回状态代码 401(未授权)。如果您无法确认资源是否存在,则返回 404(未找到)。
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.4
GET 意味着 return 资源的 表示。它没有说你必须return你所知道的关于该资源的一切。
return 表示的确切内容将取决于请求 headers。例如,您可以 return JSON 或 XML,具体取决于客户的请求。扩展这种思路;在不违反 REST 原则的情况下,return 可以根据客户端的身份验证对资源进行不同的表示。
首先,客户端会话根本不违反 REST。 REST 表示客户端和服务器之间的通信必须是无状态的,换句话说,服务器不应该要求任何请求本身不可用的信息来正确响应它。如果客户端保持会话并发送每个请求所需的所有信息,那很好。
关于您的问题,根据经过身份验证的用户更改响应并没有错。 REST 是一种架构风格,它试图将 Web 本身背后的成功设计决策应用到软件开发中。当您登录到 Stack Overflow 时,您看到的个人资料与我看到的不同,即使我们都使用相同的 URI,对吗?这就是 REST 应该如何工作的。