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

Posted

技术标签:

【中文标题】使用授权防止用户访问 REST API 中的不相关数据【英文标题】:Using Authorization to keep Users from accessing unrelated Data in a REST API 【发布时间】:2019-02-04 18:07:56 【问题描述】:

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

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

是否有处理此类问题的最佳实践?我在网上看过,但在找到解决方案方面并不是很成功,可能部分是因为我很擅长用几句话简单地表达这个问题,但无论哪种方式,我都非常感谢你们能够提供的任何建议报价!

提前致谢!

【问题讨论】:

【参考方案1】:

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

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

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

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

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

关于多对多关系,我假设如果用户有权访问一个元素,则它链接到的其他元素归同一用户/公司所有,或者它们不是此代码将在给定中修改的东西称呼。当然,我不知道您的申请,但根据我的经验,这往往是正确的。所以应该应用一次访问检查。

【讨论】:

感谢您的回复!在昨天回家的路上考虑了一段时间后,我决定按照以下模式使用这些选项的组合:公司获得了一个额外的“授权密钥”,它需要允许更改属于它的任何条目,通过那些具有相同值的实体上的“AuthorizationLock”连接。登录时,用户每次尝试执行任何需要授权的操作时都会获取 AuthorizationKey 并将其与锁进行比较。从技术上讲,我只是到处添加 CompanyID 列... Company Table 的另一个 ID(SecurityKey)并将其与实际 ID 进行比较,但这使它更有目的性的感觉,并允许它通过界面公开。 IE。所有 IAuthorizationKey 接口都必须提供密钥,所有 IAuthorizationLock 接口都必须有锁。 很高兴为您提供帮助。我实际上是在考虑通过设计来处理此类问题的数据库模型的想法。授权内置于数据模型并由数据库引擎管理。这种类型的项目似乎是该技术的理想用途,所以这个问题引起了我的注意。我更多地考虑具有签名授权访问权限的密钥对,但基本思想相同。 有趣的项目。祝你好运!

以上是关于使用授权防止用户访问 REST API 中的不相关数据的主要内容,如果未能解决你的问题,请参考以下文章

使用基本授权(用户名和密码)时出现 VSTS REST API 错误

Hadoop 未授权访问原理扫描及Apache Hadoop YARN 资源管理器 REST API未授权访问漏洞原理扫描修复记录

细说REST API安全之访问授权

使用 REST Api 授权访问商家的实时交易

如何获取华为运动健康服务授权码并调用Rest API访问数据?

如何使用 Java 防止 XSS 攻击或 Rest API JSON 中的不可信数据?