我一直在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>
请注意 - 我没有与任何
挣扎我正在努力与
这似乎是每个人都应该拥有的一个非常普遍的问题,但我找不到任何东西!请帮忙!
答案 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,他们就无法做出决定。