如何表示RESTful属性级访问控制?

时间:2011-12-22 17:50:33

标签: security rest authorization access-control

我一直在wra my my and and and and and and and I I。。。without without without。without。。。。我想写一个很好的完全RESTful服务来返回资源,但是你有权根据你的角色读取(或写入)每个资源最多的数据。因此,例如,用户可能能够在他们的个人资料上看到他们的私人电话号码,因此站点管理员也可以,但是另一个用户不会。匿名访问者可能无法看到其他用户的真实姓名,但其他用户(以及网站管理员)可以这样做。有大约4或5个访问级别以及关于可以读取或写入哪些属性的规则。写作我很满意,因为客户端可以进行PUT更改,服务器不一定全部接受(或根本不接受),但阅读是我的问题。

<user>
 <id>jimbob</id>
 <real-name>Jim Roberts</real-name> <!-- only logged-in users should see this -->
 <phone-number>+1 42424151</phone-number> <!-- only the user and admin users should see this -->
</user>

我想拥有一个包含所有公共数据的可正常缓存的用户配置文件资源,但是如何为只有特定用户可以看到的所有内容建模?我最多可以获得4个额外信息链接,其中大多数会返回大多数用户的未经授权的错误,每个链接都包含与角色相关的额外信息。但这似乎非常低效,并且还将客户与角色概念联系起来,而之前他们需要知道的只是用户。还有更好的想法吗?

<user>
 <id>...</id>
 <link rel="more" href="extra-user-profile-data-for-logged-in-users"/>
 <link rel="more" href="extra-user-profile-data-for-senior-users"/>
 <link rel="more" href="extra-user-profile-data-for-admin-users"/>
 <link rel="more" href="extra-user-profile-data-for-superadmin-users"/>
</user>

请注意 - 我没有与任何

挣扎
  • 验证
  • 资源级访问控制
  • 在服务器端实施访问控制或授权

我正在努力与

  • 如何以真正的REST方式表示“普通”HTML网站中的资源与不同的人不同。

这似乎是每个人都应该拥有的一个非常普遍的问题,但我找不到任何东西!请帮忙!

1 个答案:

答案 0 :(得分:8)

如果您考虑一下,管理客户端看到的User资源(所有字段都可见)与完全相同的资源是匿名或权限较低的客户端看到的。 URI是相同的,但他们看到的表示是不同的。

类似于客户端请求通过Accept标头以JSON而不是XML编码表示:服务器可以同意遵守该请求,但不一定要这样做。在您的情况下,服务器应返回适合客户端提供的凭据的表示。

因此,管理员可能会收到媒体类型application/vnd.yourcompany.user.full+xml内的内容作为User资源上GET返回的正文,并且它将包含所有可能的字段。

但是,匿名用户可能会收到编码为application/vnd.yourcompany.user.limited+xml的有效负载,您的文档会清楚地将其描述为可能包含或不包含full版本中所有元素的表示。客户端必须使用灵活的解码器或模式,以容忍某些元素根本不存在。

或者,您可以返回所有资源的信息,但使用特殊字段值来指示特定值已被编辑:

<user>
 <id>jimbob</id>
 <real-name>--FORBIDDEN--</real-name> 
</user>

您可以为每个角色创建媒体类型,但这会在您的安全方案和您的表示之间引入强大的耦合,这可能是不可取的。从长远来看,使用字段遗漏或价值编辑的灵活表示方案将更易于维护。

最后决定是否返回基于客户提供的凭据无法导航的其他资源的链接。在我看来,这些链接应该始终返回,即使这些凭据不起作用。为什么?因为客户端在调用这些URI时理论上可以提供其他凭据。即使他们不这样做,由此产生的401挑战也可能导致客户最终提供它们。但如果他们甚至从未获得URI,他们就无法做出决定。