基于用户查看权限的不同REST资源内容

基于用户查看权限的不同REST资源内容,rest,web-services,restapi,access-rights,Rest,Web Services,Restapi,Access Rights,我想根据访问权限为不同的用户提供相同问题的不同答案。我读到这个问题: 但我不同意公认的答案,即您应该同时提供/people.xml和/unauthenticated/people.xml,因为我对REST的理解是,特定资源应该位于特定的位置,而不是几个位置,这取决于您对它感兴趣的信息量 我正在设计的系统比那个还要复杂。假设一个用户创建了许多朋友圈,并为他们分配了不同的访问权限。例如,我的“熟人”圈子可以访问我的生日,我的“专业”圈子可以访问我的就业历史,但反过来就不行了。为了应用我提到的问题的

我想根据访问权限为不同的用户提供相同问题的不同答案。我读到这个问题:

但我不同意公认的答案,即您应该同时提供
/people.xml
/unauthenticated/people.xml
,因为我对REST的理解是,特定资源应该位于特定的位置,而不是几个位置,这取决于您对它感兴趣的信息量

我正在设计的系统比那个还要复杂。假设一个用户创建了许多朋友圈,并为他们分配了不同的访问权限。例如,我的“熟人”圈子可以访问我的生日,我的“专业”圈子可以访问我的就业历史,但反过来就不行了。为了应用我提到的问题的答案,我需要有一种获取所有用户圈的方法(出于安全原因,我可能想保密),然后通过
/circles/a/users/42
/circles/b/users/42
/circles/c/users/42
等等,然后合并结果以显示最大可用信息量。显然,不一定只有一个圆圈可以获得其他圆圈所获得的所有信息。我认为这已经足够棘手了(注意,我可能需要对几种对象执行此操作,未来的版本可能需要不同的过程),但是如果我想对某个特定用户实施安全限制,尽管他也在我的圈子里,该怎么办?这个问题能解决吗?即使我拒绝回答上述任何一个问题,并提出一个可以给我答案的新问题,它仍然会揭示这样一个事实:由于个人访问限制,这个特定用户受到不同的对待

我错过了什么?我甚至可以开发一个RESTful web服务吗


如果结论是该行为不安宁,那么这是否仍然构成违反休息合同在道德上可以接受的情况?如果是,负面影响是什么?例如,我会冒代理缓存问题的风险吗?

我同意另一种解决方案似乎不正确。这使得URL结构复杂,查找资源更加困难。但是,如果您正确地使用了REST,那么资源的URL是什么并不重要,因为服务器控制着它(并且可以根据需要自由地重新定位它)。如果您的客户机真的是“REST”,它将通过事先与服务器协商来发现所需的资源。因此,路径对客户端来说并不重要。我不喜欢它,因为它使用起来很混乱——不是因为违反了REST原则

但这可能不能回答你的问题- 您没有提到的是您的安全设置——可能您是一个正在传递会话令牌的用户,请求作为请求头的一部分。因此,后端处理应该能够将其与特定的安全约束集联系起来。从那里,您可以使用所需的任何业务逻辑形成列表,并根据与会话相关的用户安全性返回有限的资源

对于算法本身,通常实现一种限制最少或最严格的类型算法,该算法将允许的数据合并到响应中(非常类似于java领域或Microsoft的用户安全模型)


如果受限/非受限案例的数据结构不同,则可以创建两种不同的数据表示形式,并返回授权用户查看的数据表示形式。无论如何,客户端都应该请求接受的mime响应类型,它只会根据请求头中的会话安全性提供不同的答案。或者,您可以提供可选元素和表示,并根据授权填写相应的元素(尽管我认为这有点像黑客)。

根据菲尔丁的论文(这确实是一篇很棒的文章):

资源是到一组实体的概念映射,而不是在任何特定时间点对应于映射的实体

换句话说,如果您有一个定义为“请求用户分配的项目”的资源,并且URI为
/projects
可以访问该资源的表示形式,那么通过为用户a返回一个项目列表(即表示形式)和另一个项目列表(表示形式),您不会违反REST的任何约束当用户B获得相同的URI时。这样,界面是一致的

除此之外,REST仅规定响应中包含显式缓存指令,无论是“缓存这么长时间”还是“根本不缓存”:

缓存约束要求请求响应中的数据隐式或显式标记为可缓存或不可缓存

你如何选择管理,这取决于你自己

记住这一点,

只要不违反统一接口的约束,返回资源的表示形式应该会很舒服,该表示形式因请求特定资源表示形式的用户而异,不要使用单个资源标识符返回不同资源的表示形式


如果它有帮助,请考虑服务器也用资源的不同表示来响应——XML或JSON、法语或英语等等。用请求发送的凭据只是服务器在决定响应发送哪个表示时使用的另一个因素。这就是标题部分的目的。

谢谢您的回答!据我所知,如果我需要返回一组非平凡的元素,我可能会选择hack ee解决方案