使用授权可防止用户访问REST API中的不相关数据

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

首先,让我快速描述一下我的应用程序的一个非常基本的布局:我有几家公司都拥有自己的用户。有些用户可以比其他用户更多地访问操作。拥有更多访问权限的用户可以创建仪表板,而仪表板又可以包含表格(带有行和列,附加数据等),或者包含子图表,更多数据等的图表。它很快就会非常深入。该应用程序还有其他部分,但这应该足以作为一个广泛的例子。

我遇到的问题与授权有关。我使用JWT处理用户和公司级别的大多数内容(即用户是该公司的一部分,因此他可以根据其访问级别对该公司进行更改)。但是,一旦我们到达数据库中更深层的表,例如添加和编辑表的行,我就必须遍历表链,以识别该行所属的公司。这对我来说效率非常低,特别是涉及多对多关系时,对数据结构进行任何类型的更改都将是一场噩梦。另一个想法是将CompanyID的列添加到每个表中,但在我看来,这违背了关系数据的目的。

是否有处理此类问题的最佳做法?我已经在线查看,但在找到解决方案方面并不是很成功,可能部分是因为我用一些简单的话来解决这个问题,但无论哪种方式,我都非常感谢你们能提出的任何建议。提供!

提前致谢!

database rest api authorization jwt
1个回答
1
投票

我不知道这是“最佳实践”,但这是我如何处理它:

  1. 我的REST API端点让我确切地知道调用者正在尝试做什么。
  2. 我的会话管理(例如,JWT和相关用户数据)在REST API层中进行管理。当请求进入时,我加载该用户的用户和公司数据。这假设JWT不保留访问权限 - 只是用户ID。这允许访问权限在JWT的生命周期内发生变化。适用于某些应用中使用的长寿命令牌。
  3. 给定(1)和(2),代码可以确定用户是否有权运行请求。

一旦代码通过步骤(3),它就不再担心访问权限。实际上,代码的较低层不需要任何访问权限逻辑。

是的,在某些情况下,代码必须从目标表/行遍历树,以找出用户/公司拥有它。为此,我建议自定义查询,这样您只需要一次点击数据库来确定所有权。 “公司/用户A是否拥有记录X?”如果应用程序围绕该查询打败数据库,您可以始终在本地缓存答案。或者添加公司/用户ID列。

请注意,添加company id列不会破坏数据库的关系属性。当然,它可以“去标准化”它。但这只是我们作为开发人员为获得所需性能而做出的权衡之一。如果根据您的数据模型这是一个更好的解决方案,我不会感到沮丧。

关于多对多关系,我认为如果用户可以访问一个元素,则链接到的其他元素由同一个用户/公司拥有,或者它们不是此代码在给定调用中将修改的内容。当然,我不知道你的申请,但根据我的经验往往是真实的。因此,应该应用一次访问检查。

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