自定义沙箱:限制对列的访问

了解如何使用已保存的 SQL 查询向不同的人显示特定的行和列。

沙盒功能在 Pro 和企业版计划中可用,作为一种根据人员身份指定人员可以访问哪些数据的方式。我们关于行权限的文章介绍了如何创建基本沙箱,该沙箱根据人员的用户属性限制行。例如,我们创建了一个用户 Brown 女士,并授予她访问 People 和 Orders 表中与其 user_id 属性匹配的行的权限。

在本文中,我们将逐步介绍如何为 Products 表创建自定义沙箱,以限制 Brown 女士可以查看的行和列。在本例中,我们希望 Brown 女士

  • 仅查看她在 Products 表中订购的产品。
  • 仅查看标题、类别和价格列(而不查看任何其他列)。

计划

我们将

  1. 创建只有管理员才能访问的集合。

  2. 创建新的 SQL 查询。Products 表不包含有关用户的信息。因此,为了限制 Brown 女士对 Products 表的访问权限,我们需要找出 Brown 女士订购了哪些产品。我们将编写一个 SQL 查询,将 Products 表中的数据与 Orders 表中的数据结合起来。在组合这些表时,我们将创建一个新的表格结果,其中仅包含我们想要的列。

  3. 通过显示查询结果而不是 Brown 女士的原始表来沙盒化 Product 表。

  4. 通过验证 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 表中列的结果:TitleCategoryPrice
  • 检查产品是否不同,即每个产品只有一行。
  • 可选择过滤此列表,以仅显示沙盒用户订购的产品。

WHERE 子句周围的双中括号 [[…]] 使该子句成为可选的。双花括号 {{sandbox}} 定义变量。在沙盒化此问题时,我们将使用此 {{sandbox}} 变量。

让我们运行查询,这将给出此结果

SQL query to create new table.

现在让我们将此问题另存为 Products from Orders,将其存储在我们创建的 Sandbox Questions 集合中,并选择不将该问题添加到仪表板。

这里要重申一点:我们只选择了 Products 表中的列,因为我们的查询应该只返回我们要沙盒化的表中的列。

使用我们保存的问题沙盒化 Products 表

既然我们已经创建了 Products from Orders 问题,现在是时候沙盒化 Products 表了。我们将设置沙箱,以便 Metabase 将我们在关于行权限的文章中给 Brown 女士的 user_id 属性插入到我们保存的 SQL 问题 Products from Orders 中的 {{sandbox}} 变量中。

我们将单击齿轮图标,选择管理设置,然后单击权限选项卡。在左侧的数据库下,我们将单击 Sample DatabaseProducts。由于 Brown 女士是 Customers 组的成员,并且 Metabase 将数据权限授予组而不是个人,因此我们将授予 Customers 对 Products 表的沙盒访问权限。

Granting the Customer group sandboxed access to the Products table.

当 Metabase 弹出沙盒化模态框时,在“您希望如何为此组的用途过滤此表?”部分中,我们将选择第二个过滤器选项:“使用已保存的问题为此表创建自定义视图。”

我们将导航到仅限管理员访问的 Sandbox Questions 集合,并选择我们的问题 Products from Orders。对于 参数或变量,我们将选择我们在 SQL 查询中包含的变量 {{sandbox}}。对于 用户属性,我们将选择 user_id

The sandboxing modal summarizes the effects of our selection.

我们的摘要现在显示

  • Customers 组中的人员
  • 可以查看 Products from Orders 问题中的行
  • 其中 sandbox 变量的值等于 user_id

让我们单击模态框中的保存,然后通过单击通知栏中的保存更改来确认我们的更改。

以沙盒用户身份检查设置

让我们从 Brown 女士的角度看看我们的沙盒化 Products 表是什么样子的。打开一个私有浏览器窗口,导航到我们的 Metabase,然后以 Brown 女士的身份登录。

当我们使用数据浏览器打开 Products 表时,我们可以确认 Brown 女士只能看到她订购的产品列表,以及我们保存在 Products from Orders 问题中的三个列:TitleCategoryPrice

The Products table from the Metabase home page only showing products that Ms. Brown has ordered.

如果 Brown 女士提出查询 Products 表的问题,她仍然只会看到基于她订购的产品的结果。如果她有权访问包含沙箱之外的列的问题,她将看到一个错误。

在沙盒化表时首选 SQL 问题

虽然我们可以使用查询构建器问题来沙盒化表,但我们建议改用 SQL 问题。在幕后,问题会根据我们问题中的过滤器摘要连接创建 SQL 查询。当我们基于 GUI 问题进行沙盒化时,我们可能没有意识到我们正在授予人们访问权限的信息的全部范围。

或者,我们可以使用查询构建器创建一个问题,然后查看幕后以查看 Metabase 将运行的 SQL 代码。在查询构建器中,我们可以单击右上角的查看 SQL 按钮,以确认 Metabase 包含正确的表和列——仅此而已。

总结

使用问题进行沙盒化时

  • 使用 SQL 问题.
  • 确保您保存的 SQL 问题仅返回您打算沙盒化的表中的列。
  • 将沙盒化问题保存在仅限管理员访问的集合中,最好是专门用于沙盒化问题的集合。

延伸阅读

下一步:数据沙箱:个性化用户在 Metabase 中可以看到的数据

将沙箱与用户属性配对,以自定义几乎任何情况下的数据。

下一篇文章