【问题标题】:How to represent RESTful attribute level access control?如何表示 RESTful 属性级别的访问控制?
【发布时间】:2011-12-22 17:50:33
【问题描述】:

多年来,我一直在绞尽脑汁并在谷歌上搜索,但没有找到令人满意的处理方法。我想编写一个很好的完全 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>

请注意 - 我没有为任何问题苦苦挣扎

  • 身份验证
  • 资源级访问控制
  • 在服务器端实现访问控制或授权

我在挣扎

  • 如何以真正的 RESTful 方式表示“普通”HTML 网站中的资源在不同的人看来会有所不同。

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

【问题讨论】:

  • 我认为省略与用户无权查看的属性相对应的 XML 元素是合适的。我认为这与有多少基于角色的网络应用程序以 HTML 表单呈现数据是一致的。
  • 它使其无法缓存,因为否则公共数据将与相同(缓存)表示中的某些(未知)受限数据子集混合。
  • 对我来说听起来像是一个简单的问题。 1. 用户认证。 2. 用户请求一个 URI 3. 你实现的访问控制机制启动,并捕获 URI 请求。 4. 资源监视器创建要返回给请求用户的数据模板。此模板充当某种票证。 5. 服务根据它从资源监视器接收到的模板来满足 URI 指定的用户请求。 6. 服务将结果返回给用户。嗯

标签: security rest authorization access-control


【解决方案1】:

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

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

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

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

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

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

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

最终决定是是否根据客户端提供的凭据返回指向其他无法导航的资源的链接。在我看来,这些链接应该始终返回,即使这些凭据不起作用。为什么?因为客户端在调用这些 URI 时理论上可以提供其他凭据。即使他们不这样做,由此产生的401 挑战可能会导致客户最终提供它们。但如果他们连 URI 都没有得到,他们就永远无法做出那个决定。

【讨论】:

  • 您好,感谢您提供详细和深思熟虑的回复。 “有限”媒体类型的问题在于内容仍然会因角色而异,因此无法缓存。由于同样的事情适用于我系统中的几乎所有资源,这将对性能造成很大影响。您说得对,我们不想将角色与媒体类型结合起来。我喜欢将问题简化为替代表示的想法,这是有道理的,但不幸的是我还没有看到实际的解决方案。响应(但不是授权)上是否有一些标头被 Vary 标头引用以进行缓存?
  • 理想情况下,我想确保所提供的任何内容都具有公共数据的可公开缓存表示和角色特定数据的私有可缓存表示,以便为系统提供来自同一来源的同一资源再次从缓存中获取所有内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 2023-03-28
相关资源
最近更新 更多