首先,让我快速描述一下我的应用程序的一个非常基本的布局:我有几家公司都拥有自己的用户。有些用户可以比其他用户更多地访问操作。拥有更多访问权限的用户可以创建仪表板,而仪表板又可以包含表格(带有行和列,附加数据等),或者包含子图表,更多数据等的图表。它很快就会非常深入。该应用程序还有其他部分,但这应该足以作为一个广泛的例子。
我遇到的问题与授权有关。我使用JWT处理用户和公司级别的大多数内容(即用户是该公司的一部分,因此他可以根据其访问级别对该公司进行更改)。但是,一旦我们到达数据库中更深层的表,例如添加和编辑表的行,我就必须遍历表链,以识别该行所属的公司。这对我来说效率非常低,特别是涉及多对多关系时,对数据结构进行任何类型的更改都将是一场噩梦。另一个想法是将CompanyID的列添加到每个表中,但在我看来,这违背了关系数据的目的。
是否有处理此类问题的最佳做法?我已经在线查看,但在找到解决方案方面并不是很成功,可能部分是因为我用一些简单的话来解决这个问题,但无论哪种方式,我都非常感谢你们能提出的任何建议。提供!
提前致谢!
我不知道这是“最佳实践”,但这是我如何处理它:
一旦代码通过步骤(3),它就不再担心访问权限。实际上,代码的较低层不需要任何访问权限逻辑。
是的,在某些情况下,代码必须从目标表/行遍历树,以找出用户/公司拥有它。为此,我建议自定义查询,这样您只需要一次点击数据库来确定所有权。 “公司/用户A是否拥有记录X?”如果应用程序围绕该查询打败数据库,您可以始终在本地缓存答案。或者添加公司/用户ID列。
请注意,添加company id列不会破坏数据库的关系属性。当然,它可以“去标准化”它。但这只是我们作为开发人员为获得所需性能而做出的权衡之一。如果根据您的数据模型这是一个更好的解决方案,我不会感到沮丧。
关于多对多关系,我认为如果用户可以访问一个元素,则链接到的其他元素由同一个用户/公司拥有,或者它们不是此代码在给定调用中将修改的内容。当然,我不知道你的申请,但根据我的经验往往是真实的。因此,应该应用一次访问检查。