使用授权阻止用户访问REST API中无关的数据

时间:2018-08-29 21:11:22

标签: database rest api authorization jwt

首先,让我快速介绍一下我的应用程序的基本布局: 我有几家公司都有自己的用户。一些用户比其他用户拥有更多的操作权限。具有更多访问权限的用户可以创建仪表板,该仪表板又可以包含表(具有行和列,其他数据等),也可以包含具有子图表,更多数据等的图表。它很快就会变得很深。该应用程序还有其他部分,但是作为一个广泛的示例就足够了。

我遇到的问题与授权有关。我正在使用JWT在用户和公司级别上处理大多数工作(即用户是该公司的一部分,因此他可以根据其访问级别对该公司进行更改)。 但是,一旦我们到达数据库中更深的表,例如添加和编辑表的行,我就必须遍历整个表链,以识别该行所属的公司。这对我来说真的很低效,尤其是在涉及多对多关系时,对数据结构进行各种更改将是一场噩梦。另一个想法是在每个表中添加一个CompanyID列,但这违反了关系数据的目的。

是否存在处理此类问题的最佳实践?我看过网上,但是在寻找解决方案方面并没有取得很大的成功,可能部分是因为我很想用几个简单的词来表达这个问题,但是无论哪种方式,我都非常感谢你们能够提供的任何建议提供!

谢谢!

1 个答案:

答案 0 :(得分:1)

我不知道这是否是“最佳实践”,但这是我的处理方式:

  1. 我的REST API端点让我确切地知道了调用者想要做什么。
  2. 我的会话管理(例如JWT和相关的用户数据)在REST API层中进行管理。收到请求时,我会加载该用户的用户和公司数据。假设JWT不保留访问权限-仅保留用户ID。这允许在JWT的生存期内更改访问权限。对于某些应用中使用的长期令牌很有用。
  3. 给出(1)和(2),代码可以确定用户是否有权运行请求。

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

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

请注意,添加公司ID列不会破坏数据库的关系属性。当然,它可能会“去规范化”它。但这只是我们为获得所需性能而进行的开发人员所做出的取舍之一。如果考虑到您的数据模型,这是一个更好的解决方案,我不会汗流

关于多对多关系,我假设如果用户有权访问一个元素,则链接到的其他元素归同一用户/公司所有,或者这些代码不会在给定的条件下进行修改呼叫。当然,我不知道您的应用程序,但是根据我的经验,这往往是正确的。因此,一次访问检查应该适用。