我正试图想出一些方法,在我们的API上有某种形式的RLS,这在过去并不是一个问题,但随着越来越多的公司开始在我的webApp中合作,它已经成为我关注的焦点。下面是基本的表格结构:
**companies**
company1
company2
company3
**users**
user1
user2
user3
**data**
company1, specific table data
company2, specific table data
当用户需要查看来自多个公司的数据时,问题就开始了,但我们不得不创建额外的访问规则。这个表看起来像这样:
**Relationships**
**user, company, module, access_level**
user1, company1, "data", "full"
user1, company2, "data", "read"
user2, company2, "data", "full"
user2, company2, "data", "update"
然后假设我有一个类似GET /data的API端点。API知道我的用户是谁,我希望它只返回当前用户有权查看的数据。创建和更新权限等也是如此。
到目前为止,我发现的两个选择是,要么更新API端的所有查询,以便跨表进行连接,要么根据用户或不同的可能公司组合等创建视图。
问题:
这两个选项中有一个正确吗?还有其他方法我应该考虑吗?TypeOrm中是否有类似于标准行级别安全性的东西作为插件(因为它在aurora mysql中不可用)?
1条答案
按热度按时间vyswwuz21#
如果在TypeORM或任何其他客户端方法中实现行级别的安全性,它将非常弱,因为代码可以绕过它。这将是一个无效的执行。
我可以提出一些其他的解决方案:
视图
MySQL支持视图。您可以向给定的用户授予查询视图的权限,并且视图具有查询基表的权限(用户对该基表没有直接的权限)。但是视图的定义中内置了一个条件,它限制了用户可以看到的内容。
分离表或模式
您可以授予用户查询特定表或模式下的表的权限。与行级安全性不同,只需为每组数据创建一个单独的表,并授予每个用户对相应表的访问权限。
如果用户应该访问一些重叠的行子集,则这将变得不切实际。
存储过程
如果您有各种不同的访问策略,这是最灵活的,因为理论上您可以在过程中编写任意数量的逻辑。用户可以被授予调用过程的权限,而过程具有查询基表的权限。因此,用户可以获取数据,但只能以程序实现规定的方式。
我通常不鼓励在MySQL中使用存储过程,但对于强制专用访问,它可能是有效的。