自定义沙盒:限制对列的访问
了解如何使用已保存的 SQL 查询向不同用户显示特定行和列。
沙盒功能适用于 专业版和企业版方案,用于根据用户身份指定他们可以访问的数据。我们关于行权限的文章介绍了如何创建基本沙盒,根据用户的属性限制行。例如,我们创建了一个用户布朗女士,并授予她访问 People
和 Orders
表中与其 user_id
属性匹配的行。
在本文中,我们将详细介绍如何为 Products
表创建自定义沙盒,以限制布朗女士可以查看的行和列。在这种情况下,我们希望布朗女士能够:
- 在
Products
表中仅查看她已下订单的产品。 - 仅查看
Title
、Category
和Price
列(而不是其他任何列)。
计划
我们将要进行以下操作:
-
创建一个仅管理员可访问的集合。
-
创建一个新的 SQL 查询。
Products
表不包含用户相关信息。因此,为了限制布朗女士对Products
表的访问,我们需要找出布朗女士订购了哪些产品。我们将编写一个 SQL 查询,将Products
表的数据与Orders
表的数据结合起来。通过结合这些表,我们将创建一个只包含我们所需列的新表格结果。 -
通过为布朗女士显示我们查询的结果而非原始表,对
Product
表进行沙盒化。 -
通过验证布朗女士可以看到哪些数据来确认我们的沙盒。
创建一个仅管理员可访问的集合
我们将创建一个集合来存储用于此表沙盒化的 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
表中列的结果,包括Title
、Category
和Price
。 - 检查产品是否唯一,即每个产品只有一行。
- 可选地筛选此列表,以仅显示沙盒用户订购的产品。
围绕 WHERE
子句的双重方括号 [[…]]
使该子句变为可选。双重花括号 {{sandbox}}
定义变量。我们将在对这个查询进行沙盒化时使用这个 {{sandbox}}
变量。
让我们运行查询,结果如下:
现在,我们将此查询保存为 Products from Orders
,将其存储在我们创建的 Sandbox Questions
集合中,并选择不将此查询添加到仪表盘。
这里需要重申一点:我们只选择了 Products
表中的列,因为我们的查询只应返回我们想要进行沙盒化处理的表中的列。
使用我们保存的查询对 Products 表进行沙盒化
既然我们已经创建了 Products from Orders
查询,是时候对 Products
表进行沙盒化了。我们将设置沙盒,使 Metabase 将我们在关于行权限的文章中赋予布朗女士的 user_id
属性插入到我们保存的 SQL 查询 Products from Orders
的 {{sandbox}}
变量中。
我们将点击 齿轮图标,选择 管理员设置,然后点击 权限 选项卡。在左侧的 数据库 下,我们将点击 Sample Database
和 Products
。由于布朗女士是 Customers 组的成员,并且 Metabase 向组而非个人授予数据权限,我们将向 Customers 组授予对 Products
表的沙盒访问权限。
当 Metabase 弹出 沙盒模态框 时,在“您希望如何为该组中的用户筛选此表?”部分,我们将选择第二个筛选选项:“使用已保存的查询为此表创建自定义视图。”
我们将导航到我们仅限管理员访问的 Sandbox Questions
集合,并选择我们的查询 Products from Orders
。对于 PARAMETER OR VARIABLE
,我们将选择 SQL 查询中包含的变量 {{sandbox}}
。对于 USER ATTRIBUTE
,我们将选择 user_id
。
我们的摘要现在显示:
- Customers 组中的用户
- 可以查看
Products from Orders
查询中的行 - 其中
sandbox
变量的值等于user_id
我们点击模态框中的 保存,然后在通知栏中点击 保存更改 以确认我们的更改。
以沙盒用户身份检查设置
让我们从布朗女士的角度看看我们沙盒化的 Products
表是什么样子。打开一个隐私浏览窗口,导航到我们的 Metabase,并以布朗女士的身份登录。
当我们使用数据浏览器打开 Products
表时,我们可以确认布朗女士只能看到她订购的产品列表,以及我们保存的 Products from Orders
查询中包含的三列:Title
、Category
和 Price
。
如果布朗女士提出的查询涉及到 Products
表,她仍然只能看到基于她所订购产品的结果。如果她访问的查询包含了其沙盒之外的列,她将看到错误信息。
对表进行沙盒化时,首选 SQL 查询
虽然我们可以使用查询构建器问题对表进行沙盒化,但我们建议改用 SQL 查询。在幕后,问题会根据我们查询中的筛选器、摘要和联接创建 SQL 查询。当我们基于 GUI 问题进行沙盒化时,可能无法完全了解我们授予用户的信息范围。
或者,我们可以使用查询构建器创建一个查询,然后查看其内部,了解 Metabase 将运行的 SQL 代码。在查询构建器中,我们可以点击右上角的 查看 SQL 按钮,以确认 Metabase 只包含了正确的表和列。
总结
使用查询进行沙盒化时
- 使用 SQL 查询.
- 确保您保存的 SQL 查询仅返回您打算进行沙盒化处理的表中的列。
- 将沙盒查询保存在仅管理员可访问的集合中,最好是专门用于沙盒查询的集合。
延伸阅读
下一步:数据沙盒:个性化人们在 Metabase 中可见的数据
将沙盒与用户属性结合使用,可根据几乎任何情况自定义数据。