Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RESTful表示应该依赖于用户权限吗?_Rest_Restful Authentication_Hateoas - Fatal编程技术网

RESTful表示应该依赖于用户权限吗?

RESTful表示应该依赖于用户权限吗?,rest,restful-authentication,hateoas,Rest,Restful Authentication,Hateoas,我不认为授权渗透到资源的表示中是RESTful的。当前用户的标识严格来说是客户端状态,因此它不应影响资源的表示,除非标识因素或用户id或权限详细信息随请求一起发送 如果您正在使用会话,这将是过程中有状态的部分:例如,如果您想阅读某人的个人资料页面,您将有两种表示:users/123和users/123?editable=true。是否可以选择可编辑的会话取决于会话的权限。可编辑链接应显示在何处?如果它仅在您有权限的情况下出现在/users/123表示中,则它违反了服务的无状态约束,因为资源的表示

我不认为授权渗透到资源的表示中是RESTful的。当前用户的标识严格来说是客户端状态,因此它不应影响资源的表示,除非标识因素或用户id或权限详细信息随请求一起发送

如果您正在使用会话,这将是过程中有状态的部分:例如,如果您想阅读某人的个人资料页面,您将有两种表示:
users/123
users/123?editable=true
。是否可以选择可编辑的会话取决于会话的权限。可编辑链接应显示在何处?如果它仅在您有权限的情况下出现在
/users/123
表示中,则它违反了服务的无状态约束,因为资源的表示将取决于当前会话的权限:因此,如果您想为每个用户提供不同的表示,那么您必须在每个请求中发送一些关于此的信息

有人有好的解决办法吗? 是否可以使用会话并将有状态部分与服务分离

是否可以通过创建响应将权限相关部分与资源相关部分完全分离?(在这种情况下,即使使用会话,依赖于资源的部分也可以很好地维护,并且缓存起来会容易得多。)

RESTful表示应该依赖于用户权限吗

我不认为授权渗透到网络中是一种安宁 资源的表示。当前用户的标识为 严格来说是客户国,因此不应影响代表性 资源的标识因素或用户id或 权限详细信息随请求一起发送

它是客户机状态,但可以随每条消息一起发送,因此不会违反无状态约束

是否可以使用会话并将有状态部分与 服务


不允许服务器端会话,因为它们会违反无状态约束。

如果您在每个请求上发送凭据(显式或安全令牌),并在每个请求上验证授权,您仍然是无状态的,REST服务器上没有会话来记住之前登录的用户,因此我相信它仍然是RESTful的,也许可以考虑请求头(比如认证/授权)作为REST查询的隐式部分。我不这么认为,您有非常简单的授权规则。如果用户未登录,则响应必须为401。如果她已登录但未经授权,则响应必须为403。如果她被授权,那么GET请求的响应必须是资源的表示。没有这样的规则,如果用户被授权,那么她应该获得资源的表示,如果没有,那么她应该获得资源的另一个表示。。。如果您希望您的表示保持无状态和可缓存,您必须遵守这些规则……您似乎对无状态和表示有错误的想法。REST代表“代表性状态传输”。简言之,服务器通过发送给客户端的资源的表示来传递其资源的状态。通信本身是无状态的,“因此从客户端到服务器的每个请求必须包含理解请求所需的所有信息,并且不能利用服务器上存储的任何上下文”(Fielding,第5.1.3节)。您的问题有两个问题。问题#1:“如果它仅在您有权限的情况下出现在/users/123表示中,则它违反了服务的无状态约束,因为资源的表示将取决于当前会话的权限。”如果您没有会话,则情况并非如此。用户权限可以从基于HTTP基本授权头的用户名/密码凭据中派生。所以你可以这样做,从REST的角度来看也没问题。问题#2:“当前用户的身份和权限完全是客户端状态。”如果有什么不同的话,则相反。客户端甚至不需要有权限的概念。所有客户机需要的是提供一个它可以遵循的链接列表,根据其在服务器上被认为合适的特定授权进行定制。想想你典型的网页。如果发出请求的用户没有编辑给定数据的权限,则不会显示“编辑”按钮。那么,为什么RESTful API应该有所不同呢?很抱歉,我不再认为我理解您的问题或答案。REST有3种状态。还有REST客户端的状态,它可以包含浏览器中加载的当前页面、用户身份、分页设置等。。。有资源的状态,也有应用程序状态,这两种状态加在一起。当客户端发送所有请求时,客户端和服务之间的通信是无状态的,这是生成响应所必需的。如果它发送会话id,并且服务从会话存储中获取用户标识,那么通信将不会是无状态的。服务器可以选择根本不实现会话,因为HTTP Basic要求客户端为每个请求提供身份验证所需的凭据。这基本上就是你所描述的,当你说在每个请求中发送用户ID时(除了你也在发送密码)。我假设只有当客户端和服务器都不缓存散列(内部)时,这才是愚蠢的。两者都可以缓存散列并在通信中保持无状态。但是,如果您使用的是摘要,则只需要一个哈希。HTTP基本单体