自定义沙箱:限制对列的访问
学习如何使用已保存的 SQL 查询以显示不同的行和列给不同的人。
沙盒功能可在 专业版和企业版计划 中使用,作为指定人们可以访问哪些数据的一种方式。我们的关于 行权限 的文章介绍了如何创建一个 基本沙盒,该沙盒根据个人的用户属性限制行。例如,我们创建了一个用户,布朗女士,并允许她访问与她的 user_id
属性匹配的 People
和 Orders
表中的行。
在这篇文章中,我们将指导您如何为 Products
表创建一个 自定义沙盒,以限制布朗女士可以查看的行 和列。在这种情况下,我们希望布朗女士
- 只能查看她在
Products
表中已下单的产品。 - 只能查看
标题
、类别
和价格
列(以及其他任何列)。
计划
我们将
-
创建一个只有管理员可以访问的集合。
-
创建一个新的 SQL 查询。由于
Products
表不包含有关用户的信息,因此为了限制布朗女士对Products
表的访问,我们需要找出布朗女士订购了哪些产品。我们将编写一个 SQL 查询,将Products
表与Orders
表中的数据结合起来。在结合这些表时,我们将创建一个新表格结果,其中只包括我们想要的列。 -
通过显示查询结果而不是原始表来为布朗女士沙盒化
Product
表。 -
通过验证布朗女士可以看到哪些数据来确认我们的沙盒。
创建一个只有管理员可以访问的集合
我们想要创建一个集合来存储我们将用于沙盒化此表的 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}}
变量。
让我们运行查询,得到以下结果
现在让我们将这个问题保存为来自订单的产品
,存储在我们创建的沙盒问题
集合中,并选择不将问题添加到仪表板。
这里需要重申一点:我们只选择了来自产品
表的列,因为我们的查询应该只返回我们想要沙盒化的表的列。
使用我们保存的问题沙盒化产品表
现在我们已经创建了我们的来自订单的产品
问题,是时候沙盒化产品
表了。我们将设置沙盒,以便Metabase将我们在关于行权限的文章中赋予布朗小姐的user_id
属性插入到我们保存的SQL问题来自订单的产品
中的{{sandbox}}
变量中。
我们将点击齿轮图标,选择管理设置,然后点击权限选项卡。在左侧,在数据库下,我们将点击示例数据库
和产品
。由于布朗小姐是客户组的成员,并且Metabase将数据权限授予组,而不是个人,我们将授予客户对产品
表的沙盒化访问权限。
当Metabase弹出沙盒化模态框时,在“您希望如何为此组筛选此表?”部分,我们将选择第二个筛选选项:“使用保存的问题为此表创建一个自定义视图。”
我们将导航到我们的仅管理员访问的沙盒问题
集合,并选择我们的问题,来自订单的产品
。对于参数或变量
,我们将选择我们包含在SQL查询中的变量,{{sandbox}}
。对于用户属性
,我们将选择user_id
。
我们的总结现在说:
- 客户组的成员
- 可以查看
来自订单的产品
问题中的行 - 其中沙盒变量值等于
user_id
点击模态框中的保存,然后通过在通知栏中点击保存更改来确认我们的更改。
以沙盒化用户检查设置
让我们看看从布朗小姐的角度看我们的沙盒化产品
表是什么样子。打开一个私有浏览器窗口,导航到我们的Metabase,并以布朗小姐的身份登录。
当我们使用数据浏览器打开产品
表时,我们可以确认布朗小姐只能看到她订购的产品列表,以及我们包含在我们保存的来自订单的产品
问题中的三个列:标题
、类别
和价格
。
如果布朗小姐提出查询产品
表的问题,她仍然只能看到基于她订购的产品结果。如果她可以访问包括沙盒外部列的问题,她将看到错误。
沙盒化表时,优先考虑SQL问题
虽然我们可以使用查询构建器问题来沙盒化一个表,但我们建议使用SQL查询。在幕后,问题根据我们在问题中的过滤器、摘要和连接来创建SQL查询。当我们根据GUI问题进行沙盒化时,我们可能没有意识到我们提供给人们访问的信息的完整程度。
或者,我们可以使用查询构建器来创建问题,然后查看内部以了解Metabase将运行的SQL代码。在查询构建器中,我们可以点击右上角的查看SQL按钮,以确认Metabase是否包含正确的表和列——没有其他内容。
总结
使用问题进行沙盒化时
- 使用SQL查询.
- 确保您的保存的SQL查询只返回您打算沙盒化的表中的列。
- 将沙盒化问题保存在仅管理员可访问的集合中,最好是专门用于沙盒化查询的集合。
进一步阅读
下一节:数据沙盒:个性化Metabase中人们可以看到的数据
将沙盒与用户属性配对以几乎针对任何情况进行数据定制。