首页 > 解决方案 > 如何为多租户 SAAS 应用程序实施行级安全性

问题描述

在查看了创建多租户数据库架构的不同选项后,我决定对所有客户端使用“单一数据库和相同表,但我们在所有表中都有租户 ID,因此我们根据特定客户端查询数据”的方法到期易于扩展和维护/升级。

一般的方法似乎是简单地包含WHERE tenant_id = $ID每个查询,但是我了解到您可以WHERE通过实现行级安全性来进一步隔离数据并消除包含子句的需要。

我找到的关于如何做到这一点的指南不是很清楚。他们似乎都基于登录的数据库用户实现了行级安全性,这不适用于我的情况,因为我只有一个数据库用户。

基本上,当用户向我们的服务器发送 API 请求时,它将包含一个 JSON Web 令牌,该令牌在有效负载中包含一个 id。然后,服务器在“用户”数据库中查询该 id 以获取用户的orgId(又名),然后当服务器根据 API 请求查询数据库时tenant_id,它将设置为该返回值。$IDWHERE orgId = $IDorgId

在这种情况下如何实现行级安全性?

我已经搜索了其他主题,并且不认为这是一个重复的问题。

标签: databasepostgresqlmulti-tenantrow-level-security

解决方案


通常,您不能在此类设置中使用行级安全性。

行级安全性通常与数据库用户相关联,因此只有在您的应用程序通过数据库用户实现其安全性概念时才能使用它。

正如 a_horse_with_no_name 评论的那样,一种解决方法可能是设置配置参数,例如application_name来自您的应用程序和该设置的基本行级安全性。


推荐阅读