如何验证用户对 SQL table 中特定行的访问权限?

How to validate user's access to specific rows in a SQL table?

我正在做一个项目,我对网络应用程序和 SQL 都是新手,所以请耐心等待。我正在构建一个 API,我想确保我的用户只能访问特定 table 中的某些行,这些行在另一个 table 中具有指向其客户 ID 的外键,但必须通过另一个 table 中的用户 ID 进行验证。 (一个客户有多个用户并拥有多个资产。目前,客户的所有用户都可以访问任何资产,但没有客户共享资产或用户。)我能想到的方法是

SELECT * FROM [Asset] WHERE Id=@AssetId AND CustomerId=(SELECT CustomerId FROM [User] WHERE UserId=@UserId);

这很好,但是资产和用户 table 中有很多条目,此查询可能会占用大量时间。这很糟糕,因为向我的 API 发出的每个需要资产数据的请求都应该进行此检查。我可以设置一个索引,实际上 UserId 是 User 中的辅助键,因为它是来自身份验证提供程序的唯一标识符,但我不确定是否应该为资产中的 CustomerId 添加索引。与其他一些 table 相比,资产 table 的增长速度应该相对较慢(有一个消息记录 table 用于审计目的),但我不确定这是否是正确的答案,或者是否有一些更简单的答案更优化。或者这种查询的规模如此之快以至于我无需担心?

对于您的特定情况,它看起来是构建 junction table between the User table and the Asset table. Both field together will become the primary key. Individually, AssetId and UserId will be foreign keys.

的完美上下文

假设结点 table 称为 AssetUser。

外键

CONSTRAINT [FK_AssetUser_User] FOREIGN KEY ([UserId]) REFERENCES [User]([UserId])

CONSTRAINT [FK_AssetUser_Asset] FOREIGN KEY ([AssetId]) REFERENCES [Asset]([AssetId])

主键 :

CONSTRAINT [PK_AssetUser] PRIMARY KEY([AssetId], [UserId]));

除非您要拥有大量数据,否则您不必担心规模太大 and/or 性能在您的应用程序中至关重要。如果是这样,您可以选择使用 hadoop 或迁移到 NoSQL 数据库。