Gar*_*den 12 security rest authorization access-control
我一直在wra my my and and and and and and and..............我想写一个很好的完全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>
Run Code Online (Sandbox Code Playgroud)
我想拥有一个包含所有公共数据的可正常缓存的用户配置文件资源,但是如何为只有某些用户可以看到的所有内容建模?我最多可以获得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>
Run Code Online (Sandbox Code Playgroud)
请注意 - 我没有与任何人挣扎
我正在努力
这似乎是每个人都应该拥有的一个非常普遍的问题,但我找不到任何东西!请帮忙!
如果您考虑一下,User管理客户端看到的资源(所有字段都可见)与匿名或权限较低的客户端看到的资源完全相同.URI是相同的,但他们看到的表示是不同的.
它类似于让客户端请求通过Accept标头以JSON而不是XML编码表示:服务器可以同意遵守该请求,但不一定非必要.在您的情况下,服务器应返回适合客户端提供的凭据的表示.
因此,管理员可能会收到媒体类型中的内容application/vnd.yourcompany.user.full+xml作为User资源上GET返回的正文,并且它将包含所有可能的字段.
但是,匿名用户可能会收到编码为say的有效负载,application/vnd.yourcompany.user.limited+xml您的文档会清楚地将其描述为可能包含或不包含该full版本中所有元素的表示.客户端必须使用灵活的解码器或模式,以容忍某些元素根本不存在.
或者,您可以返回所有资源的信息,但使用特殊字段值来指示特定值已编辑:
<user>
<id>jimbob</id>
<real-name>--FORBIDDEN--</real-name>
</user>
Run Code Online (Sandbox Code Playgroud)
您可以为每个角色创建媒体类型,但这会在您的安全方案和您的表示之间引入强大的耦合,这可能是不可取的.从长远来看,使用字段省略或价值编辑的灵活表示方案将更易于维护.
最后决定是否返回基于客户提供的凭证无法导航的其他资源的链接.在我看来,应该始终返回这些链接,即使这些凭据不起作用.为什么?因为客户端在调用这些URI时理论上可以提供其他凭据.即使他们不这样做,由此产生的401挑战可能导致客户最终提供它们.但如果他们甚至从未获得URI,他们就会被阻止做出这个决定.