配置多租户数据权限
了解如何限制客户对行、列或模式的访问,以实现安全的自助式分析。
多客户单模式(混合数据)
如果所有客户数据都在相同的模式和表格中(通常称为“数据混合”)
租户 ID | 列 1 | 列 2 |
---|---|---|
A | … | … |
B | … | … |
C | … | … |
数据沙盒是最佳选择。大多数使用 Metabase 提供多租户分析的组织会使用
您还可以配置 SSO 与数据沙盒权限,以便用户在首次登录时就能获得正确的行和列访问级别。要了解有关多租户权限和嵌入如何协同工作的更多信息,请参阅使用 SSO 和数据沙盒保护数据。
基于租户 ID 限制行
假设您有一个名为 Data 的表格,它看起来像这样
租户 ID | 卓越指标 | 非凡洞察 |
---|---|---|
A | … | … |
B | … | … |
C | … | … |
您可以创建一个基本沙盒,根据租户 ID 向不同租户显示 Data 的筛选版本。这意味着租户 A 将看到 Tenant ID 列值为“A”的行,租户 B 将看到 Tenant ID 列值为“B”的行,依此类推。
基本沙盒的工作方式如下
- 您将创建一个组,例如“沙盒租户”,并将 Metabase 帐户添加到该组中。
- 对于每个用户的帐户,您将添加一个用户属性,例如“租户 ID”,其用户属性值设置为“A”、“B”或“C”。
- 设置好带有用户属性的组后,从您的管理设置 > 权限中创建一个基本沙盒。
基本沙盒将显示 Data 表,并对 Tenant ID 列应用筛选器。筛选器值将根据每个人的登录动态设置。例如,用户属性“租户 ID”设置为“A”的帐户将看到对 Tenant ID = A
进行筛选的 Data 表。
基于租户限制列
现在,想象一下您的非凡洞察列是一个高级功能,而租户 B 是唯一付费查看这些非凡洞察的客户。租户 A 和 C 正在节省开支,所以他们只能看到卓越指标。
租户 ID | 卓越指标 | 非凡洞察 |
---|---|---|
A | … | |
B | … | … |
C | … |
在这种情况下,您可以将租户 A 留在行限制示例中的基本沙盒。但您需要将租户 A 和 C 移至自定义沙盒——这将允许您除了限制行之外还限制列。
以下是您如何设置自定义沙盒以选择性地隐藏列(除了将租户限制在其自己的行中)
- 创建一个名为“仅指标租户”的组。
- 将租户 A 和租户 C 的人员移动(或添加)到“仅指标租户”组。
当您以不同方式为不同组设置 Data 表的沙盒时,请确保每个 Metabase 帐户只属于一个组——要么是“沙盒租户”,要么是“仅指标租户”。
- 对于每个 Metabase 帐户,您必须添加一个用户属性,例如“租户 ID”,其用户属性值设置为“A”、“B”或“C”。
-
接下来,您将使用 Data 表创建如下 SQL 问题
SELECT marvelous_metrics FROM tenants WHERE tenant_id = {{ tenant_user_attribute }}
- 将 SQL 问题保存为“卓越指标”。
- 使用“仅指标租户”组和“卓越指标”SQL 问题创建一个自定义沙盒。
自定义沙盒将向“仅指标租户”组中的人员显示“卓越指标”SQL 问题(代替原始 Data 表)。
例如,用户属性“租户 ID”设置为“A”的人将只看到 Data 表中的卓越指标列,并筛选到 Tenant ID 列值为 A 的行。
多模式(每个客户一个模式)
如果您的客户数据存储在同一模式中的不同表或一个数据库中的不同模式中,像这样
租户 A 的模式
租户 A | 列 1 | 列 2 |
---|---|---|
第 1 行 | … | … |
第 2 行 | … | … |
第 3 行 | … | … |
租户 B 的模式
租户 B | 列 1 | 列 2 |
---|---|---|
第 1 行 | … | … |
第 2 行 | … | … |
第 3 行 | .. | … |
您可以选择以下选项
与混合数据不同,每个客户一个模式(反社会?)的数据与沙盒不兼容,因为沙盒只能在行和列级别分配权限,而不能在模式级别。
授予客户对其模式的自助服务或只读访问权限
假设您有一个包含十个不同表的数据库,并且这些表中的每一个都对应一个客户(在本例中是不同的公司)。我们的目标是确保每个客户只能访问包含他们自己信息的表。
注意:以下方法假定您的客户不需要访问 Metabase 的原生 SQL 编辑器,而是会使用查询构建器来提问。
-
如果您尚未进行,请将您的数据源连接到 Metabase。
-
在管理设置 > 权限 > 数据中,阻止所有用户组对数据库的访问。
-
在管理设置 > 人员中,为您的第一个客户创建一个组。您可能每个公司只需要一个组,但如果您的客户希望他们的一些员工能够提问,而另一些员工只能查看,您将需要为每个客户创建多个组,以便您可以设置不同的权限级别。按照既定的约定命名您的组可以帮助您保持井然有序——考虑使用类似公司 A (自助服务) 和公司 A (只读) 的名称。
-
返回到权限 > 数据 > 数据库页面,然后授予您新创建的组访问与相应客户关联的表的权限。如果您希望客户能够在其表内提问和创建仪表板,请将其创建查询权限更改为查询构建器。在此上下文中,创建查询访问权限指的是表,而不是整个数据库。
如果您的客户有一些员工应该只查看数据(而不是拥有自助服务访问权限),您将需要创建集合来存放这些特定问题和仪表板。请参阅集合权限。
避免授予您的组访问原生 SQL 编辑器的权限,因为这种原生查询编辑允许用户查询他们在 Metabase 中看不到且不应有权访问的表。
-
重复步骤 3-5,添加您所有十个客户的用户帐户。
如果您授予一个组访问数据库中所有表的权限,并且稍后修改数据库以包含新表,Metabase 将默认授予该组对新表的访问权限。但是,如果您将每个组的权限范围限定为单个表——就像我们上面所做的那样——Metabase 将默认隐藏您添加的任何新表。
授予客户对其模式的原生 SQL 访问权限
由于 Metabase 的 SQL 编辑器需要对您的整个数据库进行无限制访问,如果使用上述方法启用它,您的客户将能够查询不属于他们的表。如果原生 SQL 查询是您的客户的必需品
-
在数据库级别(而非 Metabase 中)为您的第一个客户创建一个用户帐户。此用户帐户应仅具有访问数据库中其特定表或模式的权限。例如,如果您有一个 Postgres 数据库,您需要通过 psql 向数据库添加一个用户。在 Postgres 中,您随后只授予他们您希望客户看到的表的权限。
-
在 Metabase 中,使用您刚刚在数据库中创建的用户帐户添加一个到您的数据库的连接。
-
在 Metabase 中创建一个新的组。授予该组访问您新添加的数据库的权限——即与该客户模式对应的连接。由于数据库级别的用户角色决定了您的客户可以查看什么,您可以授予该组对数据库的可查看访问权限,以及查询构建器和原生访问权限。
属于该组的人员将能够在 Metabase 中看到 Postgres 用户(或您正在使用的任何数据库)在数据库中拥有的所有表。如果您以后想隐藏某个表,您需要更改数据库本身的权限,而不是 Metabase 中的权限。即使您在 Metabase 中隐藏了一个表,具有原生访问权限的人仍然可以查询它们。
-
邀请您的第一个用户,并在过程中将其添加到相应的组中。如果您使用 SSO 来处理帐户创建,则无需手动邀请用户。
-
对其余客户重复步骤 1-4。在 Metabase 中,看起来您添加了与客户数量一样多的数据库。
以编程方式创建沙盒权限
如果您服务于成百上千的客户,请考虑使用 Metabase API 编写权限流程脚本。如果您需要设置新的 Metabase 实例,或者希望为每个客户复制相同的仪表板和已保存的问题,序列化功能(适用于专业版和企业版计划)可以帮助加快进程。请记住,序列化不包括权限设置,因此您需要通过脚本或手动配置哪些组可以访问每个表。
进一步阅读
下一步:如何跟踪您的数据
设置使用分析警报,以便在人们更改设置、下载数据或公开数据时收到通知。