通过用户定义的权限过滤 REST 资源端点的最佳实践?

问题描述 投票:0回答:1

我有一个实体

Store
,可通过 REST 端点
/api/v1/stores
进行查询。用户只能访问他们有权访问的商店。用户可以是有权配置商店设置的
admin
,也可以是可以管理商店订单的
manager
。用户也可以两者兼而有之。

从 UI 角度来看,我的应用程序有两个视图,一个管理视图和一个管理视图。在这两个视图中,我想检索仅具有该视图相关权限的商店(即,管理部分仅显示我具有管理员权限的商店,管理视图仅显示我具有管理权限的商店)。

如果我只是从

/api/v1/stores
端点获取商店而不使用显式过滤器,这将返回我可以以任何方式访问的所有商店(即管理员和经理访问权限)。

那么问题是过滤商店以仅返回我感兴趣的商店的最佳实践是什么?

是否应该是一个查询过滤器,例如

/api/v1/stores?filter=permission:admin
?它应该是一个特定于角色的端点(我不是特别喜欢这个想法)?或者有什么更好的吗?

我显然可以在这里实现我想要的任何内容,但我想知道是否有任何标准方法可以通过 UI 定义的权限级别来过滤结果。

rest api-design user-permissions
1个回答
0
投票

总结

我建议类似:

/api/v1/users/{userId}/stores/admin

/api/v1/users/{userId}/stores/management

(您甚至可以将

{userId}
替换为
me
- 见下文)。

我的想法为什么

  • 我认为不需要过滤器。仅当您要拥有可扩展类型的过滤器参数(即大量且动态)或需要组合应用过滤器时,它才会有用。

  • 您提到用户界面中有两种不同的视图,这对我来说它们是一个定义明确的案例。所以对得起自己的终点。您永远(大概)不需要在同一个调用中访问管理和管理存储,因为它们位于不同的 UI 视图中。

  • 我采用了以用户为中心的端点结构视图,因此很明显,商店仅可供该用户使用。这就是为什么我在它前面放了一个用户词干。

删除 {userId}

假设您在端点上进行了正确的身份验证,您就已经知道用户 ID。

如果您的用户不需要访问不同用户的数据,那么您可以像这样简化端点:

/api/v1/users/me/stores/admin

/api/v1/users/me/stores/management

...这会保留您稍后添加 {userId} 路径的选项。

© www.soinside.com 2019 - 2024. All rights reserved.