【问题标题】:How can I express access-control through a REST-style service?如何通过 REST 样式的服务表达访问控制?
【发布时间】:2012-03-28 13:11:54
【问题描述】:

我正在尝试构建一系列 REST 样式的服务,供各种内部系统使用。这些服务维护一个内部访问控制系统,该系统确定用户是否有权对特定资源执行操作。

前端系统期望有一种方法来测试用户对指定资源的访问权限,以便他们可以删除其 UI 上依赖于这些操作的功能,这样他们就不会最终向服务发出请求会阻塞。

我如何将这些访问控制信息传达给我的客户?是否有任何约定可以表达您可以对任何指定资源执行的操作?

目标是向客户传递足够的信息,以便他们知道他们可以对资源提出哪些类型的请求,而无需期待 403 响应。

编辑:

我正在考虑向我的资源中的链接添加“支持的操作”:

<contact>
    <addresses href="/contact/12345/addresses" actions="GET" />
</contact>

如果调用者无权访问资源,则链接不会出现在文档中。

它确实迫使我明确说明每个资源上可用的操作,并且客户端必须阅读我提供的每个链接上的这些信息,并且它并不容易处理 PUT 请求(因为您将指定您希望处理的 URL)。

这看起来合理吗?有没有更好的约定来实现这一点?

编辑:

为了任何未来读者的参考,我决定将可用操作放在指向现有资源的链接上,因此调用者不需要发出单独的 OPTION 请求。

对于通过 PUT 请求创建新资源,这有点棘手,因为资源尚不存在通过 URL 描述。在这些情况下,我决定使用描述“添加”机制的“子”链接:

<contact>
    <addresses href="/contact/12345/addresses" actions="GET">
        <add href="/contact/12345/addresses/[name]" actions="PUT"/>
    </addresses>
</contact>

有点接近于描述 RPC 样式的接口,但它确实描述了操作(添加新资源作为地址的子项)以及它在文档中的缺失(在第一个示例)将用于指示您无权访问该资源。

除此之外,我将尝试支持 OPTIONS,以便客户可以根据需要逐个检查资源。

【问题讨论】:

    标签: rest access-control


    【解决方案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
    

    【讨论】:

    • 抱歉,我可能不清楚:我不想传达角色列表 - 我想传达给定资源的客户端系统应该能够执行的操作成功使用当前用户上下文。
    • 查看我的编辑。不过,我承认我现在有点不适应了。
    • HTTP OPTIONS 确实提供了“允许”标头中的信息。我对这种方法的唯一担心是,它需要一次往返来获取每个资源的访问控制信息,而且如果您要处理大量资源,这会感觉非常昂贵。跨度>
    • 那么我会去做你已经在做的事情:向客户端返回资源列表和允许的方法以响应一些 GET 调用。
    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 2016-12-09
    • 2016-04-01
    • 2010-09-17
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多