数据沙盒
数据沙盒仅适用于 Pro 和 Enterprise 套餐(包括自托管和 Metabase 云版)。
数据沙盒允许您为不同人群组提供行和列的精细权限。您可以沙盒化群组可以查看的数据,以及群组使用查询构建器可以查询的数据。
您可以使用沙盒设置自助分析,以便每个客户只查看与其客户 ID 匹配的行。例如,如果您有一个包含客户信息的“账户”表,您可以对该表进行沙盒化,以便每个客户只看到与自己相关的数据。
数据沙盒示例
您可以跳过理论,直接查看沙盒示例。
沙盒的工作原理
您可以将数据沙盒视为一系列权限的捆绑,其中包括:
- 一个表的筛选版本,它将在 Metabase 中所有使用原始表的地方替换原始表。
- 应该看到表筛选版本的群组。
在 Metabase 中,您可以为每个表/群组组合定义一个数据沙盒。这意味着您可以为不同群组显示表的不同版本,例如向销售人员显示“销售沙盒账户”,向销售经理显示“经理沙盒账户”。
数据沙盒类型
数据沙盒根据每个人的用户属性向其显示特定数据。您可以:
基本沙盒(按表中的列进行筛选) | 自定义沙盒(使用已保存的 SQL 问题) | |
---|---|---|
通过筛选单个列来限制行 | ✅ | ✅ |
通过筛选多个列来限制行 | ❌ | ✅ |
限制列 | ❌ | ✅ |
编辑列 | ❌ | ✅ |
基本数据沙盒:按表中的列进行筛选
要限制行,请使用基本沙盒。基本沙盒会向一个群组显示表的筛选版本,而不是原始表。筛选器通过将表中的列设置为特定的用户属性值来工作。
例如,您可以创建一个基本沙盒来筛选某个群组的“账户”表,以便:
- 具有用户属性值“Basic”的用户将看到
Plan = "Basic"
的行(即 Plan 列与值“Basic”匹配的行)。 - 具有用户属性值“Premium”的用户将看到
Plan = "Premium"
的行(即 Plan 列与值“Premium”匹配的行)。
自定义数据沙盒:使用已保存的问题创建表的自定义视图
要限制列和行,请使用自定义沙盒(也称为高级沙盒)。自定义沙盒会显示已保存的 SQL 问题的结果,而不是您的原始表。
例如,假设您的原始账户表包含列:ID
、Email
、Plan
和 Created At
。如果您想隐藏 Email 列,您可以创建一个“沙盒化账户”SQL 问题,其中包含列:ID
、Plan
和 Created At
。
自定义沙盒将在 Metabase 中使用“账户”表的所有地方,向特定群组显示“沙盒化账户”问题的结果,而不是原始“账户”表。
您还可以使用自定义沙盒来:
限制
不适用于沙盒的情况。
具有原生查询权限(访问 SQL 编辑器)的群组无法沙盒化
您无法为沙盒化群组设置查询构建器和原生查询。
要使用原生查询编辑器强制执行行级权限,请查看模拟。
SQL 问题无法沙盒化
由于 Metabase 无法解析 SQL 查询,因此 SQL 问题的结果将始终使用原始表,而不是沙盒化表。
使用集合权限可防止沙盒化群组查看包含受限数据的已保存 SQL 问题。
非 SQL 数据库的沙盒功能受限
MongoDB 仅支持基本沙盒。Apache Druid 不支持数据沙盒权限。
基本沙盒的先决条件
基本沙盒会向特定群组显示筛选后的表,而不是原始表。Metabase 如何筛选该表取决于每个用户属性中的值。
例如,您可以设置一个基本沙盒,以便:
- 具有键为“plan”且值为“Basic”的用户属性的用户将看到“账户”表的版本,其中包含
Plan = "Basic"
的筛选器(即,只有 Plan 列与值“Basic”匹配的行)。 - 具有设置为“Premium”的用户属性“plan”的用户将看到“账户”表的另一个版本,其中应用了
Plan = "Premium"
筛选器。
为数据沙盒选择用户属性
基本沙盒需要用户属性,而自定义沙盒则可选。添加新用户属性时,您需要为每个人设置一个键值对。
Metabase 使用用户属性键查找特定用户的用户属性值。用户属性键可以映射到 Metabase 中的参数。
用户属性值必须与沙盒化表的筛选值精确匹配,且区分大小写。例如,如果您正在“账户”表上创建基本沙盒,并使用筛选器 Plan = "Basic"
,请确保将“Basic”作为用户属性值输入。如果您将用户属性值设置为小写的“basic”(在“账户”表的 Plan 列中不存在的值),沙盒用户将获得空结果,而不是沙盒表。
用户属性的实际应用示例
创建基本沙盒
- 请务必先完成基本沙盒的先决条件。
- 转到管理设置 > 权限。
- 选择要沙盒化的数据库和表。
- 找到要放入沙盒的群组。
- 点击该群组查看数据下的下拉菜单。
- 选择“沙盒化”。
- 点击列下的下拉菜单,输入要筛选表的列,例如“Plan”。
- 点击用户属性下的下拉菜单,输入用户属性键,例如“Plan”。
如果您有使用沙盒数据的已保存 SQL 问题,请务必将所有这些问题移动到仅限管理员访问的集合中。欲了解更多信息,请参阅权限冲突:已保存的 SQL 问题。
您可以在数据沙盒示例中找到基本沙盒设置示例。
自定义沙盒的先决条件
- 要添加到高级数据沙盒的人员群组。
- 一个仅限管理员访问的集合,其集合权限设置为除管理员之外的所有群组无访问权限。
- 一个已保存的SQL 问题,其中包含要向自定义沙盒中的人员显示的行和列,并存储在仅限管理员访问的集合中。
- 可选:如果您想在自定义沙盒中限制行,请为群组中的每个人设置用户属性。
创建 Metabase 用于在自定义沙盒中显示的 SQL 问题
在高级数据沙盒中,Metabase 会向特定群组显示已保存的问题,而不是原始表。
使用 SQL 问题定义要包含在沙盒中的精确行和列。如果您使用查询构建器(GUI)问题,您可能会意外暴露额外数据,因为 GUI 问题可以包含来自其他已保存问题或模型的数据。
请务必将 SQL 问题保存在仅限管理员访问的集合中(集合权限设置为除管理员之外的所有群组无访问权限)。欲了解更多信息,请参阅权限冲突:已保存的 SQL 问题。
在自定义沙盒中显示已编辑的列
除了从自定义沙盒中排除行和列之外,您还可以显示已编辑的列(无需更改数据库中的列)。
例如,您可以创建一个“沙盒化账户”SQL 问题,该问题会截断 Email 列以显示用户名,而不是完整的电子邮件地址。
如果您编辑列,已保存的 SQL 问题(您要在沙盒中显示的问题)的模式必须与原始表的模式匹配。这意味着“沙盒化账户”SQL 问题必须返回与原始“账户”表相同数量的列和对应的数据类型。
您无法向自定义沙盒添加列。
创建自定义沙盒
- 请务必先完成自定义沙盒的先决条件。
- 转到管理设置 > 权限。
- 选择要沙盒化的数据库和表。
- 找到要放入沙盒的群组。
- 点击该群组数据访问下的下拉菜单。
- 选择“沙盒化”。
- 选择“使用已保存的问题为此表创建自定义视图”。
- 选择您已保存的问题。该问题应以 SQL 编写。如果问题包含参数,则这些参数必须是必需的(不能是可选的)。
- 可选:根据用户属性限制行。
如果您有使用沙盒数据的已保存 SQL 问题,请务必将所有这些问题移动到仅限管理员访问的集合中。
您可以在数据沙盒示例中找到自定义沙盒设置示例。
使用用户属性在自定义沙盒中限制行
您可以设置自定义沙盒,根据每个人的用户属性限制不同的行。例如,您可以向一个群组显示带有 Plan = "Basic"
筛选器的“沙盒化账户”问题,向另一个群组显示带有 Plan = "Premium"
筛选器的“沙盒化账户”问题。
- 请务必完成自定义沙盒的所有先决条件。
- 转到将显示给自定义沙盒中人员的已保存 SQL 问题。
- 向您的 SQL 查询添加一个参数化的
WHERE
子句,例如WHERE plan = {{ plan_variable }}
。 - 保存 SQL 问题。
- 转到管理设置 > 权限。
- 找到自定义沙盒的群组和表。
- 打开查看数据下的下拉菜单。
- 点击编辑沙盒访问。
- 向下滚动并将参数或变量设置为已保存 SQL 问题中参数的名称(例如“Plan Variable”)。
- 将用户属性设置为用户属性键(例如键“User’s Plan”,而不是值“Basic”)。
- 点击保存。
有关 SQL 变量和用户属性设置示例,请参阅数据沙盒示例。
行限制在自定义沙盒中的工作原理
用户属性、SQL 参数和自定义沙盒如何协同工作以向不同的人显示不同的行。
标准 WHERE
子句通过将列设置为固定值来筛选表
WHERE column_name = column_value
在上述行限制设置的第 2 步中,您将添加一个 SQL 变量,以便 WHERE
子句接受动态值。SQL 变量类型必须是文本、数字或日期。
WHERE plan = {{ plan_variable }}
在上述行限制设置的第 9-10 步中,您正在告诉 Metabase 将 SQL 变量 plan_variable
映射到用户属性键(例如“User’s Plan”)。Metabase 将使用该键查找与用户的 Metabase 账户关联的特定用户属性值(例如“Basic”)。当该用户登录 Metabase 并使用沙盒化表时,他们将看到已筛选的查询结果,筛选依据为:
WHERE plan = "Basic"
请注意,用于创建自定义沙盒的 SQL 问题中的参数必须是必需的。例如,您不能使用可选参数;以下内容将不起作用:
[[WHERE plan = {{ plan_variable }}]]
了解有关SQL 参数的更多信息
防止数据沙盒权限冲突
某些 Metabase 权限可能与数据沙盒冲突,从而导致比您预期更宽松或更严格的数据访问。
假设您有一个自定义沙盒,它会从“账户”表中隐藏 Email 列(针对特定群组)。
如果以下情况发生,Email 列可能会暴露给沙盒用户:
多个数据沙盒权限
同一表上的多个数据沙盒可能会产生权限冲突。您最多可以通过用户的群组将一个人添加到每个表的一个数据沙盒中。
例如,如果您有:
- 一个针对“基本账户”群组的沙盒,它在“账户”表上按
Plan = "Basic"
进行筛选。 - 另一个针对“已转化账户”群组的沙盒,它在“账户”表上按
Trial Converted = true
进行筛选。
如果将 Vincent Accountman 放入两个组中,他将会在“账户”表的沙盒中遇到冲突,并且在 Metabase 中尝试使用“账户”时会收到错误消息。
解决数据沙盒权限冲突
- 将此人从所有组中移除,仅保留在一个组中。
- 将所有组中除了一个组之外的其他组的查看数据访问权限设置为“已阻止”。
已保存的 SQL 问题无法沙盒化
数据沙盒权限不适用于 SQL 问题的结果。也就是说,已保存的 SQL 问题将始终显示来自原始表的结果,而不是沙盒化的表的结果。
假设您有一个自定义沙盒,它隐藏了“账户”表中的“电子邮件”列。如果一个未沙盒化的人创建了一个包含“电子邮件”列的 SQL 问题,那么任何具有查看该 SQL 问题的集合权限的人都将能够
- 在 SQL 问题结果中看到“电子邮件”列。
- 使用该 SQL 问题来创建包含“电子邮件”列的新问题。
为防止“电子邮件”列通过 SQL 问题泄露
- 将所有包含“电子邮件”列的 SQL 问题放入一个单独的集合中。
- 对于不应查看“电子邮件”列的沙盒组,将集合权限设置为无访问权限。
必须使用集合权限来防止沙盒组查看引用沙盒表的已保存 SQL 问题。这就是为什么当您创建自定义沙盒时,必须将已保存的 SQL 问题(您希望在沙盒中显示的问题)放入仅限管理员的集合中。
公开共享
数据沙盒权限不适用于公开问题或公开仪表板。如果一个未沙盒化的人使用原始表创建了一个公共链接,那么拥有该公共链接 URL 的任何人都会看到原始表。
为了防止这种情况发生,您必须为您的 Metabase 实例禁用公开共享。
Metabase 只能通过已登录人员的组员资格或用户属性来创建数据沙盒。由于公共链接不需要登录,Metabase 将没有足够的信息来创建沙盒。
延伸阅读
阅读其他Metabase 版本的文档。