7

如果您有一个REST APIthat is (HATEOAS),您可以通过在响应 ( )hypermedia-driven中包含或省略链接来轻松更改客户的行为。_links这使客户端能够完全忘记测试在当前状态下可能执行的操作的权限(操作resource的链接是否存在)。

此外,如果当前用户无权查看它,您可以在响应中省略属性。

这样授权完全在服务器上完成(并控制有资格执行/查看的操作和属性)。

但是,如果我想拥有read-only房产怎么办?REST API如果请求(_POST__PUT_)中存在该属性,则忽略该属性是没有问题的。它只是不会被保存。但是客户端如何区分写入只读属性以向用户呈现适当的控件(如禁用的输入字段在HTML)?

目标是永远不会拥有client request用户的权限,而是拥有完全由资源驱动的client/frontend.

任何帮助是极大的赞赏 :-)

4

1 回答 1

1

如果我误解了你的问题,我先道歉。话虽这么说...

但是客户端如何区分写入和只读属性以向用户呈现适当的控件(如 HTML 中的禁用输入字段)

好吧,有多种解决方案。我个人能想到的最简单的方法是使每个属性成为一个具有简单结构的对象,例如:

    ...

    someProperty: {
        value: 'some value',
        access: 'read-only'
    },
    someOtherProperty: {
        value: 'some value',
        access: 'write'
    }
    ...

显然,您可以通过如何表示属性的“访问”级别(使用枚举、布尔值、更改accessisReadOnly或其他)获得尽可能多的创意。

在那之后,使用 API 的人现在知道它们是否是只读的。如果他们将“只读”属性的“写入”值作为 POST 有效负载的一部分提交,那么他们应该期望得到 403 响应。

编辑:如果您不能以这种方式更改属性,还有许多其他方法仍然可以实现:

  • 编写说明每个属性的访问权限的文档
  • 创建一个用户可以提交 1 个或多个属性的路由,以便接收指示每个属性的访问级别的响应(响应:{ propName: 'read-only', propName2: 'write' 等)
  • 返回一个 propertyAccess 映射作为响应的一部分(将属性映射到访问级别)。

归根结底,您只需要一种方法来映射具有访问级别的属性。但是,这取决于您对 api 的限制和要求,您可以进行哪些更改,以及您的客户和业务要求都可以接受的内容。

于 2015-07-25T19:01:02.083 回答