避免访问未经授权的数据 - 架构级别

Avoiding accessing unauthorized data - architectural level

我有一个 SQL 服务器数据库,将包含多个客户的数据 每个客户都有管理员用户来管理他自己的与其员工相关的数据,我会给每个客户一个使用该系统存储的许可并管理他的业务数据(与他的员工相关的数据)每个员工都有一个帐户并且有一些权限来执行一些特定的操作和请求。

我的问题, 如何永久阻止客户管理员用户访问另一个客户的员工? 我在询问与系统架构级别相关的最佳实践或想法以避免此类错误,我不想将决定权留给开发人员,因为任何错误的 SQL 查询都会导致此问题.

在数据库级别有两种主要的多租户方法,权衡非常不同:

  1. 按行租户:这基本上需要将客户 ID 或租户 ID 列放入每个数据库 table,并确保所有查询都将其用作其选择标准的一部分。如果您不信任开发人员(您已经有麻烦了),您可以将他们隐藏在存储过程后面(不推荐,只为开发人员制定规则)。
  2. 按模式租户:按模式租户更安全,但更昂贵。它需要为每个租户提供一个新模式。每个租户都有自己的 SQL 服务器连接,他们的查询转到他们的模式。这具有绝对防止跨客户读取的优势,但实施起来要昂贵得多。它需要在添加新租户时在 运行 时执行 DDL,并且升级成本更高(您必须升级 dozens/hundreds/thousands 数据库模式,具体取决于您有多少客户。另外,SQL 服务器在处理那么多小 table 时性能不会很好。Statistics/backups/maintenance 会更昂贵且更难管理。