使用授权防止用户访问 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未授权访问漏洞原理扫描修复记录