【发布时间】:2020-05-03 21:44:00
【问题描述】:
面临的问题在于 RESTful API 的设计,该 API 可以在基于 RBAC 的解决方案中管理来自多个角色的请求。
目前我们有不同的资源可以被不同的用户访问,根据他们的权限可以有一个或多个角色。
我们尝试定义的 API 必须对客户端尽可能清晰,但又不能向 URL 添加额外的元数据,否则可能会损坏甚至与 REST 实践和定义发生冲突。因此,我们必须不惜一切代价避免在 URL 中包含有关角色的信息。该计划是使用 JWT 令牌,在其有效负载中携带所需的信息,以了解用户发出请求的权限。
提出了我们目前的情况,让我们举个例子并说明要解决的问题:
假设我们有 * 金融家 * 和 * 提供者 * 作为具有某些角色的用户,他们都想访问 ** attentions **(我们的资源)。我们是否应该在资源之前添加**注意**有关尝试访问资源的*用户*的信息?
这种情况下的端点应定义为(作为示例):
https://example.com/api/v1/financiers/:id/attentions
https://example.com/api/v1/providers/:id/attentions
通过这种方式,我们试图通知相应的控制器我们希望针对特定角色/用户获得**关注**,在某种程度上,这些角色/用户是它们的子资源。
另一方面,我们可以简单地实现一个更简单的端点,如下所示:
https://example.com/api/v1/attentions
关于哪些注意力从数据库返回的逻辑现在应该以一种独特的方法实现,该方法必须处理这两个角色(以及可能在以下功能中出现的新角色)。所需的所有信息都必须从令牌的有效负载中获取,从而公开更通用的 API,并将 Web 客户端从根据角色调用哪个端点的责任中解放出来。
我想强调注意力是在微服务架构中管理的,因此检索它们的逻辑被收集在单个服务中。 API 网关从第一个解决方案路由两个(可能更多)端点的成本是在我们的特定情况下不丢弃的变量。
暴露了我们的现状:
- 我们将是处理此问题的最佳方法?
- 是否有其他未考虑的替代方案可以简化角色管理并提供干净的 API 以向客户端公开?
- 在第二种解决方案中,根据特定用户所拥有的角色,仅返回可访问的注意力是否正确?访问端点并仅根据其角色从该集合中获取部分资源(而不是全部)不是违反直觉吗?
我希望有人能澄清我们正在采取的方法,因为我发现关于这个问题的文献很少,也没有。
【问题讨论】:
标签: rest security jwt roles rbac