REST具有对资源的复杂权限

时间:2015-04-08 23:46:19

标签: security rest design-patterns

背景

我在设计和实现REST服务方面遇到了麻烦,该服务发布了一些用户无法查看的内容(医疗信息,您知道,国家/地区的法律),我正在使用类似ABAC的/ RBAC系统来保护他们,但让我担心的是我可能违反了REST模式。我的服务为每个查询执行以下过程:

  1. 安全中间件从应用程序/网页使用授权标头或cookie发送的会话中读取令牌。
  2. 应用ABAC / RBAC规则以了解用户是否可以访问该资源。
  3. 授权令牌后,我的服务执行查询并过滤结果,隐藏请求用户无法看到的内容(如果需要.POST,PUT和DELETE操作几乎不受此步骤的影响)。过滤器使用ABAC / RBAC规则完成。
  4. 操作报告存储在日志中。
  5. 我已经知道会话违反了REST模式,但我可以使用BASIC / DIGEST授权替换它。我真正的问题如下:

    问题

    从列表/检索操作中隐藏资源是否违反了REST模式?据我所知,REST是无状态的,所以......如果我使用一些上下文变量来过滤我的结果(用户ID)会发生什么?我是否违反了REST?完全没有?

    如果我这样做,你有什么建议?如何在不违反REST约定的情况下实现此目的?

3 个答案:

答案 0 :(得分:1)

首先,客户端会话根本不违反REST。 REST说客户端和服务器之间的通信必须是无状态的,换句话说,服务器不应该要求请求本身没有的任何信息来正确响应它。如果客户端保持会话并发送每个请求所需的所有信息,那就没问题了。

关于您的问题,根据经过身份验证的用户更改响应没有任何问题。 REST是一种架构风格,试图将网络本身背后的成功设计决策应用于软件开发。当您登录Stack Overflow时,您看到的配置文件与我看到的不同,即使我们都使用相同的URI,对吧?那就是REST应该如何运作。

答案 1 :(得分:0)

如果用户无权访问资源,我建议返回状态代码401(未授权)。如果您无法确认资源是否存在,则为404(未找到)。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.4

答案 2 :(得分:0)

GET旨在返回资源的表示。没有任何地方说你必须归还你所知道的有关该资源的一切。

确切地返回什么表示将取决于请求标头。例如,您可能会返回JSON或XML,具体取决于客户端请求的内容。扩展这种思路;可以根据客户端的身份验证返回资源的不同表示,而不违反REST主体。