具有权限限制字段的 JSON API REST端点
我正在开发一个符合JSON API的REST api.某些端点包含应为某些用户限制(只读或不可用)的字段.
构建api以允许某些用户访问某些字段的最佳方法是什么,而其他用户则不然? “最好”,我的意思是:
>最符合REST标准,理想情况是JSON API标准
>代表使用API的客户防止错误和混淆方面的最清晰
我正在考虑以下选项,每个选项都有一组关注/问题.对于任何其他解决方案,我将不胜感激!
选项1:对于没有权限的用户,在受限字段上返回null
>每个用户将返回不同的数据值.这是严格的反REST吗?
> null之间缺乏区别“null value”和null意味着“您无法访问此”
>在REST / JSON API体系结构中,端点是否可以根据权限为每个用户返回不同的数据?我的印象是这与基于资源的REST架构的精神相悖,但我找不到任何特定于任何文档或标准(例如JSON API)的内容.也适用于选项2.
>是否有任何范例在资源的元数据中添加某种“你没有访问权限”标志?
选项2:完全为没有权限的用户排除受限字段
>每个用户将返回不同的数据值.这是严格的反REST吗?
>在尝试检索字段值时,客户端中存在“未定义”错误的可能性
选项3:将受限制的字段移动到另一个端点,对于有权限的人,可以作为?include =’field_name’关系使用
>示例:/ api / entity包含属性字段“cost”,仅供管理员用户使用.管理员用户可以通过GET / api / entity?include = cost请求成本数据.对于所有用户,“cost”作为资源对象中的关系公开,具有“type”和“id”.
>这是我倾向于的选择.这里的主要内容是端点混乱.我有很多关系需要在单独的端点中进行,只是为了支持已经存在的端点上的权限隔离数据.
>在JSON API规范中,我无法确定端点是否可以仅作为关系存在,例如我们可以有/ api / entity / 1 / cost,但没有顶级api端点,/ api / cost.我的假设是,如果资源具有“类型”(在这种情况下,关系类型为“成本”),它还必须存在于顶级端点上.
>在这种情况下,如果非管理员用户尝试GET / api / entity,则客户端可能会收到401:Unauthorized错误响应?include = cost或GET / api / cost /:id
注意:我已经构建了一个单独的权限模式,以便客户端可以在发出任何请求之前确定每个顶级端点用户具有哪些CRUD权限.权限集按资源类型编制索引.
任何有关此事的帮助将非常感谢!如果有任何需要澄清的话,请随时提出.
最佳答案 我肯定不会使用undefined或null来指示不允许用户看到的字段.对我来说,这感觉就像一个谎言,并表示数据真的不存在.他们必须真正了解您的API才能掌握实际情况.
我会推荐更像你的第三个选项的东西,除了我会把它作为一个不同的端点.所以在你的例子中,端点将是:
/ API /实体/ 1 /成本
和管理员
/ API /管理/实体/ 1 /成本
或类似的东西.
通过这种方式,管理端点的服务器代码可以专注于对此管理员用户进行身份验证,并将其返回给他们可见的所有字段.如果非管理员用户尝试点击该路由,请使用未经授权的状态代码拒绝他们.
我不是说你不应该实现GET参数也能指定字段.如果你愿意,你可以,但我不认为在这种情况下它是不必要的.