我正在尝试构建一系列REST风格的服务,这些服务将被各种内部系统使用。这些服务维护着一个内部访问控制系统,该系统确定用户是否有权对特定资源执行操作。
前端系统期望有一种方法来测试用户对指定资源的访问权限,以便他们可以删除依赖于这些操作的UI上的功能,因此他们不会最终发出请求服务将阻止。
如何将此访问控制信息传达给我的客户?是否有任何约定来表达您允许对任何指定资源执行的操作?
目标是向客户传递足够的信息,以便他们知道他们可以对资源提出何种类型的请求而不期待403响应。
修改
我在考虑为我的资源中的链接添加“支持的操作”:
<contact>
<addresses href="/contact/12345/addresses" actions="GET" />
</contact>
如果调用者无法访问资源,则链接将不在文档中。
它确实迫使我明确了解每个资源上可用的操作,并且客户端必须在我提供的每个链接上读取此信息,并且它不会使处理PUT请求变得容易(因为您将指定您希望使用的网址。)
这看起来合情合理吗?是否有更好的约定来实现这一目标?
修改
对于未来读者的参考,我决定将可用的操作放在现有资源的链接上,因此呼叫者不需要单独发出OPTION请求。
为了通过PUT请求创建新资源,它有点棘手,因为尚不存在通过URL描述的资源。在这些情况下,我决定使用描述“添加”机制的“子”链接:
<contact>
<addresses href="/contact/12345/addresses" actions="GET">
<add href="/contact/12345/addresses/[name]" actions="PUT"/>
</addresses>
</contact>
这是 little 接近描述RPC样式的接口,但它确实描述了操作(将新资源添加为地址的子资源)以及它不在文档中(在第一个示例)将用于表示您无权访问该资源。
除此之外,我将尝试支持OPTIONS,以便客户可以根据资源进行检查,如果有需要的话。
答案 0 :(得分:1)
我不知道有任何用于查询角色的REST约定。
我个人会实现一个系统,我会向(例如)/users/johndoe/roles
发出GET,并希望返回一个可用角色列表。
当然,应该以只有指定用户和管理员才能检索信息的方式保护该呼叫本身。
编辑:根据您的其他信息,您可能需要查看the HTTP OPTIONS method(如果您的客户可以支持它。)如果您已经通过HTTP处理了身份验证,并且您希望知道您可以在给定资源上执行的HTTP方法(GET,POST等),可以使用OPTIONS将此信息传达给客户端。例如:
OPTIONS /resource HTTP/1.0
HTTP/1.1 200 OK
Date: Wed, 28 Mar 2012 14:44:47 GMT
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Length: 0
Connection: close