自定义沙箱:限制对列的访问
了解如何使用已保存的 SQL 查询向不同的人显示特定的行和列。
沙盒功能在 Pro 和企业版计划中可用,作为一种根据人员身份指定人员可以访问哪些数据的方式。我们关于行权限的文章介绍了如何创建基本沙箱,该沙箱根据人员的用户属性限制行。例如,我们创建了一个用户 Brown 女士,并授予她访问 People 和 Orders 表中与其 user_id 属性匹配的行的权限。
在本文中,我们将逐步介绍如何为 Products 表创建自定义沙箱,以限制 Brown 女士可以查看的行和列。在本例中,我们希望 Brown 女士
- 仅查看她在 Products 表中订购的产品。
- 仅查看标题、类别和价格列(而不查看任何其他列)。
计划
我们将
-
创建只有管理员才能访问的集合。
-
创建新的 SQL 查询。Products 表不包含有关用户的信息。因此,为了限制 Brown 女士对 Products 表的访问权限,我们需要找出 Brown 女士订购了哪些产品。我们将编写一个 SQL 查询,将 Products 表中的数据与 Orders 表中的数据结合起来。在组合这些表时,我们将创建一个新的表格结果,其中仅包含我们想要的列。
-
通过显示查询结果而不是 Brown 女士的原始表来沙盒化 Product 表。
-
通过验证 Brown 女士可以看到哪些数据来确认我们的沙箱。
创建只有管理员才能访问的集合
我们将创建一个集合来存储我们将用于沙盒化此表的 SQL 查询。我们将其命名为 Sandbox Questions,并在此集合上设置权限,以便只有管理员可以管理其问题。这样,非管理员将无法更改问题并更改沙箱的“维度”,例如,通过包含 Brown 女士不应看到的列。请参阅集合权限以了解有关设置权限的更多信息。
创建 SQL 查询
从顶部栏中,单击 + 新建 > SQL 查询 以提出 SQL 问题。选择 Metabase 附带的示例数据库。
这是我们将粘贴到编辑器中的查询
SELECT DISTINCT PRODUCTS.TITLE,
PRODUCTS.CATEGORY,
PRODUCTS.PRICE
FROM PRODUCTS
LEFT JOIN ORDERS ON ORDERS.PRODUCT_ID=PRODUCTS.ID
[[WHERE ORDERS.USER_ID IN ({{sandbox}})]]
这是查询的作用
- 返回包含 Products 表中列的结果:
Title
、Category
和Price
。 - 检查产品是否不同,即每个产品只有一行。
- 可选择过滤此列表,以仅显示沙盒用户订购的产品。
WHERE 子句周围的双中括号 [[…]]
使该子句成为可选的。双花括号 {{sandbox}}
定义变量。在沙盒化此问题时,我们将使用此 {{sandbox}}
变量。
让我们运行查询,这将给出此结果
现在让我们将此问题另存为 Products from Orders
,将其存储在我们创建的 Sandbox Questions
集合中,并选择不将该问题添加到仪表板。
这里要重申一点:我们只选择了 Products 表中的列,因为我们的查询应该只返回我们要沙盒化的表中的列。
使用我们保存的问题沙盒化 Products 表
既然我们已经创建了 Products from Orders
问题,现在是时候沙盒化 Products 表了。我们将设置沙箱,以便 Metabase 将我们在关于行权限的文章中给 Brown 女士的 user_id
属性插入到我们保存的 SQL 问题 Products from Orders
中的 {{sandbox}}
变量中。
我们将单击齿轮图标,选择管理设置,然后单击权限选项卡。在左侧的数据库下,我们将单击 Sample Database
和 Products
。由于 Brown 女士是 Customers 组的成员,并且 Metabase 将数据权限授予组而不是个人,因此我们将授予 Customers 对 Products
表的沙盒访问权限。
当 Metabase 弹出沙盒化模态框时,在“您希望如何为此组的用途过滤此表?”部分中,我们将选择第二个过滤器选项:“使用已保存的问题为此表创建自定义视图。”
我们将导航到仅限管理员访问的 Sandbox Questions
集合,并选择我们的问题 Products from Orders
。对于 参数或变量,我们将选择我们在 SQL 查询中包含的变量 {{sandbox}}
。对于 用户属性
,我们将选择 user_id
。
我们的摘要现在显示
- Customers 组中的人员
- 可以查看 Products from Orders 问题中的行
- 其中
sandbox
变量的值等于user_id
让我们单击模态框中的保存,然后通过单击通知栏中的保存更改来确认我们的更改。
以沙盒用户身份检查设置
让我们从 Brown 女士的角度看看我们的沙盒化 Products
表是什么样子的。打开一个私有浏览器窗口,导航到我们的 Metabase,然后以 Brown 女士的身份登录。
当我们使用数据浏览器打开 Products
表时,我们可以确认 Brown 女士只能看到她订购的产品列表,以及我们保存在 Products from Orders
问题中的三个列:Title
、Category
和 Price
。
如果 Brown 女士提出查询 Products
表的问题,她仍然只会看到基于她订购的产品的结果。如果她有权访问包含沙箱之外的列的问题,她将看到一个错误。
在沙盒化表时首选 SQL 问题
虽然我们可以使用查询构建器问题来沙盒化表,但我们建议改用 SQL 问题。在幕后,问题会根据我们问题中的过滤器、摘要和连接创建 SQL 查询。当我们基于 GUI 问题进行沙盒化时,我们可能没有意识到我们正在授予人们访问权限的信息的全部范围。
或者,我们可以使用查询构建器创建一个问题,然后查看幕后以查看 Metabase 将运行的 SQL 代码。在查询构建器中,我们可以单击右上角的查看 SQL 按钮,以确认 Metabase 包含正确的表和列——仅此而已。
总结
使用问题进行沙盒化时
- 使用 SQL 问题.
- 确保您保存的 SQL 问题仅返回您打算沙盒化的表中的列。
- 将沙盒化问题保存在仅限管理员访问的集合中,最好是专门用于沙盒化问题的集合。
延伸阅读
下一步:数据沙箱:个性化用户在 Metabase 中可以看到的数据
将沙箱与用户属性配对,以自定义几乎任何情况下的数据。