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

学习如何使用已保存的 SQL 查询以显示不同的行和列给不同的人。

沙盒功能可在 专业版和企业版计划 中使用,作为指定人们可以访问哪些数据的一种方式。我们的关于 行权限 的文章介绍了如何创建一个 基本沙盒,该沙盒根据个人的用户属性限制行。例如,我们创建了一个用户,布朗女士,并允许她访问与她的 user_id 属性匹配的 PeopleOrders 表中的行。

在这篇文章中,我们将指导您如何为 Products 表创建一个 自定义沙盒,以限制布朗女士可以查看的行 和列。在这种情况下,我们希望布朗女士

  • 只能查看她在 Products 表中已下单的产品。
  • 只能查看 标题类别价格 列(以及其他任何列)。

计划

我们将

  1. 创建一个只有管理员可以访问的集合。

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

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

  4. 通过验证布朗女士可以看到哪些数据来确认我们的沙盒。

创建一个只有管理员可以访问的集合

我们想要创建一个集合来存储我们将用于沙盒化此表的 SQL 查询。让我们称其为 Sandbox Questions,并为该集合设置权限,以便只有管理员可以管理其问题。这样,非管理员就无法更改问题并改变沙盒的“维度”,例如包含布朗女士不应看到的列。有关设置权限的更多信息,请参阅 集合权限

创建一个 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 表的列:标题类别价格 的结果。
  • 检查产品是否唯一,即每个产品只有一行。
  • 可选地过滤此列表,只显示沙盒化用户订购的产品。

双方括号 [[…]] 围绕的 WHERE 子句是可选的。双大括号 {{sandbox}} 定义了变量。当沙盒化此问题时,我们将使用此 {{sandbox}} 变量。

让我们运行查询,得到以下结果

SQL query to create new table.

现在让我们将这个问题保存为来自订单的产品,存储在我们创建的沙盒问题集合中,并选择不将问题添加到仪表板。

这里需要重申一点:我们只选择了来自产品表的列,因为我们的查询应该只返回我们想要沙盒化的表的列。

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

现在我们已经创建了我们的来自订单的产品问题,是时候沙盒化产品表了。我们将设置沙盒,以便Metabase将我们在关于行权限的文章中赋予布朗小姐的user_id属性插入到我们保存的SQL问题来自订单的产品中的{{sandbox}}变量中。

我们将点击齿轮图标,选择管理设置,然后点击权限选项卡。在左侧,在数据库下,我们将点击示例数据库产品。由于布朗小姐是客户组的成员,并且Metabase将数据权限授予组,而不是个人,我们将授予客户对产品表的沙盒化访问权限。

Granting the Customer group sandboxed access to the Products table.

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

我们将导航到我们的仅管理员访问的沙盒问题集合,并选择我们的问题,来自订单的产品。对于参数或变量,我们将选择我们包含在SQL查询中的变量,{{sandbox}}。对于用户属性,我们将选择user_id

The sandboxing modal summarizes the effects of our selection.

我们的总结现在说:

  • 客户组的成员
  • 可以查看来自订单的产品问题中的行
  • 其中沙盒变量值等于user_id

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

以沙盒化用户检查设置

让我们看看从布朗小姐的角度看我们的沙盒化产品表是什么样子。打开一个私有浏览器窗口,导航到我们的Metabase,并以布朗小姐的身份登录。

当我们使用数据浏览器打开产品表时,我们可以确认布朗小姐只能看到她订购的产品列表,以及我们包含在我们保存的来自订单的产品问题中的三个列:标题类别价格

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

如果布朗小姐提出查询产品表的问题,她仍然只能看到基于她订购的产品结果。如果她可以访问包括沙盒外部列的问题,她将看到错误。

沙盒化表时,优先考虑SQL问题

虽然我们可以使用查询构建器问题来沙盒化一个表,但我们建议使用SQL查询。在幕后,问题根据我们在问题中的过滤器摘要连接来创建SQL查询。当我们根据GUI问题进行沙盒化时,我们可能没有意识到我们提供给人们访问的信息的完整程度。

或者,我们可以使用查询构建器来创建问题,然后查看内部以了解Metabase将运行的SQL代码。在查询构建器中,我们可以点击右上角的查看SQL按钮,以确认Metabase是否包含正确的表和列——没有其他内容。

总结

使用问题进行沙盒化时

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

进一步阅读

下一节:数据沙盒:个性化Metabase中人们可以看到的数据

将沙盒与用户属性配对以几乎针对任何情况进行数据定制。

下一篇文章