database - 如何为多租户 SAAS 应用程序实施行级安全性
问题描述
在查看了创建多租户数据库架构的不同选项后,我决定对所有客户端使用“单一数据库和相同表,但我们在所有表中都有租户 ID,因此我们根据特定客户端查询数据”的方法到期易于扩展和维护/升级。
一般的方法似乎是简单地包含WHERE tenant_id = $ID
每个查询,但是我了解到您可以WHERE
通过实现行级安全性来进一步隔离数据并消除包含子句的需要。
我找到的关于如何做到这一点的指南不是很清楚。他们似乎都基于登录的数据库用户实现了行级安全性,这不适用于我的情况,因为我只有一个数据库用户。
基本上,当用户向我们的服务器发送 API 请求时,它将包含一个 JSON Web 令牌,该令牌在有效负载中包含一个 id。然后,服务器在“用户”数据库中查询该 id 以获取用户的orgId
(又名),然后当服务器根据 API 请求查询数据库时tenant_id
,它将设置为该返回值。$ID
WHERE orgId = $ID
orgId
在这种情况下如何实现行级安全性?
我已经搜索了其他主题,并且不认为这是一个重复的问题。
解决方案
通常,您不能在此类设置中使用行级安全性。
行级安全性通常与数据库用户相关联,因此只有在您的应用程序通过数据库用户实现其安全性概念时才能使用它。
正如 a_horse_with_no_name 评论的那样,一种解决方法可能是设置配置参数,例如application_name
来自您的应用程序和该设置的基本行级安全性。
推荐阅读
- android - Firebase Phone Auth is not working version 20.0.0 in android
- sql - 为数据库对象自动生成脚本
- python - 如何从输入字符串中匹配并打印连续的反斜杠和破折号(\-\-\-\-)?
- ios - 我如何在苹果商店升级 ios Flutter 应用程序?
- accessor - 使用 mutators 和 accessor 时的 Laravel livewire 问题
- javascript - Animate on scroll using react.js
- c# - 控制台应用程序的温度提示用户?
- python - Firebase 身份验证 - 进行远程服务调用时出现未知错误
- reactjs - 在 react-scripts start 中配置中间件
- java - 如何使用 zxing 在 Java 中生成可下载的二维码?