在回顾了用于创建多租户数据库体系结构的不同选项之后,由于易于扩展和维护/升级,我决定使用'Single database and same tables for all client, but we have tenant_id in all tables, so we query the data according to specific client'方法。
一般方法似乎是为每个查询简单地包含WHERE tenant_id = $ID
,但是我了解到您可以通过实现行级来进一步隔离数据并消除包含WHERE
子句的需要安全性。
尽管我对如何做到这一点的指导并不十分清楚。他们似乎都基于登录的数据库用户来实现行级安全性,因为我只有一个数据库用户,因此不适用于我的情况。
基本上,当用户向我们的服务器发送API请求时,它将包含一个JSON网络令牌,该令牌在有效负载中包含一个ID。然后,服务器在“用户”数据库中查询该ID以获取用户的orgId
(又名tenant_id
),然后服务器根据API请求查询数据库时,它将设置{{1} } $ID
中的}返回此WHERE orgId = $ID
值。
在这种情况下如何实现行级安全性?
我搜索了其他主题,但不认为这是一个重复的问题。
答案 0 :(得分:1)
通常,您不能在这种设置下使用行级安全性。
行级安全性通常与数据库用户绑定,因此只有在您的应用程序对数据库用户实施其安全性概念时,才可以使用行级安全性。
正如a_horse_with_no_name所评论的那样,一种解决方法可能是在应用程序中设置诸如application_name
之类的配置参数,并根据该设置设置行级安全性。