RESTful HTTP:在同一URI上向两个用户显示不同的表示形式

时间:2010-07-11 22:37:31

标签: authentication architecture rest restful-authentication access-control

我正在设计一个超媒体API,是的,一个RESTful API,具有超文本约束。

系统的每个用户都将使用自己的凭据访问系统,因此我们处理的每个请求都经过身份验证和授权。每个用户通常都会拥有特定的凭据,以便他们可以在每个集合上拥有不同的权限(例如,无,读取,读/写)。

我们希望客户端能够使用它开头的一个URI,这可能是原子服务文档,或原子集合的层次结构(草稿原子层次结构扩展)。

我的问题基本上是用户应该看到相同URI的不同表示,还是应该根据用户的权限将用户定向到不同的URI?

例如:用户A和用户B在系统中具有不同的权限。他们使用不同的凭据登录到相同的起始URI。成功的回复可能是以下2之一:

  1. 200 OK,用户A在同一个URI上看到与用户B不同的内容
  2. 302(或其他重定向)每个用户例如/ endpoint / userA(他们拥有)
  3. 可缓存性之间的权衡当然是最小的,因为资源仅由客户端缓存,而不是由中介缓存,但是也可以通过权衡(URI包含(经过验证的)用户ID)。最后,将来可能允许用户A(或超级用户)查看用户B看到的内容。

    我不是在问Twitter或Facebook做什么,我对REST实用者对此有何看法感兴趣。

3 个答案:

答案 0 :(得分:1)

我个人认为这是一个非常艰难的要求,我认为这取决于很多内容会有多大变化。如果差异是遗漏了一些额外的细节,那么我可能会将其视为根据用户而变化的单一资源。

然而,一旦差异开始变得更加重要,那么我会考虑创建不同的资源。我仍然会尝试避免创建特定于特定用户的资源。也许对于特定资源,您可以创建一组具有不同内容级别的子资源。 e.g。

/Customer/123?accesslevel=low
/Customer/123?accesslevel=medium
/Customer/123?accesslevel=high

在某些情况下,该方法与302组合可能就足够了。对于更复杂的情况,您可以使用多个查询字符串参数。

/Employee/123?SocialSecurityNo=yes&SalaryInfo=yes

我不相信这个问题有一个简单的答案。我认为答案类似于最棘手的REST场景:只要您不违反约束条件,您的解决方案就可以像您想要的那样具有创造性: - )

答案 1 :(得分:1)

  

我的问题基本上应该是用户看到不同的表示形式   对于相同的URI,或者应该将用户定向到基于不同的URI   他们的权限?

     

例如:用户A和用户B具有不同的权限   系统。他们使用不同的凭据登录到相同的起始URI。   成功的回复可能是以下2之一:

     
      
  1. 200 OK,用户A看到与用户B不同的东西   URI
  2.   
  3. 302(或其他重定向)每个用户例如/ endpoint / userA(其中   他们拥有)
  4.   

两种方式都是RESTful。资源的表示可以取决于权限。通信是无状态的,因为您通过每个请求发送带有http auth的凭据(用户名,密码)。在权限检查后重定向到另一个表示变体是一个好主意。这样,您就可以将授权逻辑与资源表示逻辑完全分离,这样您甚至可以将其移动到另一台服务器,并且可以创建非常好的可缓存资源表示。例如,GET /endpoint/userA您可以将userA重定向到/endpoint/userA?owner=true,因为她是个人资料的所有者,或者您可以创建功能组合:/endpoint/userA?feature1=true&feature2=false等...为此设置细粒度访问控制非常容易。如果将用户ID附加到每个请求的queryString,则保持可缓存的另一种方法,但这种具有重定向的解决方案更加清晰。谢谢你!

答案 2 :(得分:0)

选项1,回复200是一个可接受的REST响应,比选项2更加用户友好。

Google Data API在其用户服务之上提供了不错的REST实现,并且实现了选项1.例如,Google Calendar Data API允许用户通过在{上执行HTTP GET请求来查询此人自己的Feed {3}}。