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

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

沙盒功能适用于 专业版和企业版方案,用于根据用户身份指定他们可以访问的数据。我们关于行权限的文章介绍了如何创建基本沙盒,根据用户的属性限制行。例如,我们创建了一个用户布朗女士,并授予她访问 PeopleOrders 表中与其 user_id 属性匹配的行。

在本文中,我们将详细介绍如何为 Products 表创建自定义沙盒,以限制布朗女士可以查看的行和。在这种情况下,我们希望布朗女士能够:

  • Products 表中仅查看她已下订单的产品。
  • 仅查看 TitleCategoryPrice 列(而不是其他任何列)。

计划

我们将要进行以下操作:

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

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

  3. 通过为布朗女士显示我们查询的结果而非原始表,对 Product 表进行沙盒化。

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

创建一个仅管理员可访问的集合

我们将创建一个集合来存储用于此表沙盒化的 SQL 查询。我们将其命名为 Sandbox Questions 并在此集合上设置权限,以便只有管理员才能管理其中的查询。这样,非管理员将无法修改查询并更改沙盒的“维度”,例如包含布朗女士不应看到的列。请参阅集合权限了解有关设置权限的更多信息。

创建 SQL 查询

在顶部栏中,点击 + 新建 > SQL 查询提问 SQL 问题。选择 Metabase 附带的Sample Database

以下是我们将粘贴到编辑器中的查询:

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 将我们在关于行权限的文章中赋予布朗女士的 user_id 属性插入到我们保存的 SQL 查询 Products from Orders{{sandbox}} 变量中。

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

Granting the Customer group sandboxed access to the Products table.

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

我们将导航到我们仅限管理员访问的 Sandbox Questions 集合,并选择我们的查询 Products from Orders。对于 PARAMETER OR VARIABLE,我们将选择 SQL 查询中包含的变量 {{sandbox}}。对于 USER ATTRIBUTE,我们将选择 user_id

The sandboxing modal summarizes the effects of our selection.

我们的摘要现在显示:

  • Customers 组中的用户
  • 可以查看 Products from Orders 查询中的行
  • 其中 sandbox 变量的值等于 user_id

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

以沙盒用户身份检查设置

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

当我们使用数据浏览器打开 Products 表时,我们可以确认布朗女士只能看到她订购的产品列表,以及我们保存的 Products from Orders 查询中包含的三列:TitleCategoryPrice

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

如果布朗女士提出的查询涉及到 Products 表,她仍然只能看到基于她所订购产品的结果。如果她访问的查询包含了其沙盒之外的列,她将看到错误信息。

对表进行沙盒化时,首选 SQL 查询

虽然我们可以使用查询构建器问题对表进行沙盒化,但我们建议改用 SQL 查询。在幕后,问题会根据我们查询中的筛选器摘要联接创建 SQL 查询。当我们基于 GUI 问题进行沙盒化时,可能无法完全了解我们授予用户的信息范围。

或者,我们可以使用查询构建器创建一个查询,然后查看其内部,了解 Metabase 将运行的 SQL 代码。在查询构建器中,我们可以点击右上角的 查看 SQL 按钮,以确认 Metabase 只包含了正确的表和列。

总结

使用查询进行沙盒化时

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

延伸阅读

下一步:数据沙盒:个性化人们在 Metabase 中可见的数据

将沙盒与用户属性结合使用,可根据几乎任何情况自定义数据。

下一篇文章
© . All rights reserved.