如何为多租户 SAAS 应用实施行级安全性
How to implement row level security for a multi-tenant SAAS app
在查看了创建多租户数据库架构的不同选项后,我决定使用 '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' 方法,因为它易于扩展并且 maintenance/upgrading.
一般的方法似乎是简单地为每个查询包含 WHERE tenant_id = $ID
,但是我了解到您可以进一步隔离数据并通过实施来消除包含 WHERE
子句的需要行级安全性。
虽然我找到的关于如何执行此操作的指南不是很清楚。他们似乎都基于登录的数据库用户实现了行级安全性,这对我的情况不起作用,因为我只有一个数据库用户。
基本上,当用户向我们的服务器发送 API 请求时,它将包含一个 JSON 网络令牌,该令牌在有效负载中包含一个 id。然后服务器在 'users' 数据库中查询该 id 以获取用户的 orgId
(又名 tenant_id
),然后当服务器根据 API 请求查询数据库时,它将 WHERE orgId = $ID
中的 $ID
设置为此返回的 orgId
值。
如何在这种情况下实现行级安全性?
我搜索了其他主题,我认为这不是一个重复的问题。
通常情况下,您不能在此类设置中使用行级安全性。
行级安全性通常与数据库用户相关联,因此只有在您的应用程序实现其与数据库用户的安全性概念时才能使用它。
正如 a_horse_with_no_name 评论的那样,解决方法可能是从您的应用程序中设置配置参数,例如 application_name
,并在该设置上设置基本行级安全性。
在查看了创建多租户数据库架构的不同选项后,我决定使用 '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' 方法,因为它易于扩展并且 maintenance/upgrading.
一般的方法似乎是简单地为每个查询包含 WHERE tenant_id = $ID
,但是我了解到您可以进一步隔离数据并通过实施来消除包含 WHERE
子句的需要行级安全性。
虽然我找到的关于如何执行此操作的指南不是很清楚。他们似乎都基于登录的数据库用户实现了行级安全性,这对我的情况不起作用,因为我只有一个数据库用户。
基本上,当用户向我们的服务器发送 API 请求时,它将包含一个 JSON 网络令牌,该令牌在有效负载中包含一个 id。然后服务器在 'users' 数据库中查询该 id 以获取用户的 orgId
(又名 tenant_id
),然后当服务器根据 API 请求查询数据库时,它将 WHERE orgId = $ID
中的 $ID
设置为此返回的 orgId
值。
如何在这种情况下实现行级安全性?
我搜索了其他主题,我认为这不是一个重复的问题。
通常情况下,您不能在此类设置中使用行级安全性。
行级安全性通常与数据库用户相关联,因此只有在您的应用程序实现其与数据库用户的安全性概念时才能使用它。
正如 a_horse_with_no_name 评论的那样,解决方法可能是从您的应用程序中设置配置参数,例如 application_name
,并在该设置上设置基本行级安全性。