教程:Metabase 中的列级权限
了解如何使用保存的 SQL 查询向不同的人显示特定的行和列。
正在查找关于列安全性的文档?请参阅 文档:行和列安全性。
行和列安全性在 Pro 和 Enterprise 版本中可用,作为根据用户身份指定他们可以访问哪些数据的方式。我们关于 行级别权限的文章介绍了如何基于用户的属性限制行。例如,我们创建了一个名为 Ms. Brown 的用户,并授予她访问 People 和 Orders 表中与其 user_id 属性匹配的行的权限。
在本文中,我们将介绍如何限制 Ms. Brown 可以查看的 Products 表的行和列。在这种情况下,我们希望 Ms. Brown
- 仅在
Products表中查看她下过订单的产品(行级别安全性) - 仅查看
Title、Category和Price列(而不是其他任何列)。
行和列安全以前称为数据沙盒。这是同一个功能,只是现在有了更具描述性的名称。
计划
我们将
-
创建一个仅管理员可以访问的集合。
-
创建一个新的 SQL 查询。Products 表不包含用户信息。因此,要限制 Ms. Brown 对 Products 表的访问,我们需要找出 Ms. Brown 订购了哪些产品。我们将编写一个 SQL 查询,该查询将 Products 表的数据与 Orders 表的数据相结合。通过结合这两个表,我们将创建一个仅包含我们想要的新表格结果。
-
通过显示我们查询的结果而不是原始表来限制 Ms. Brown 对 Products 表的查看。
-
通过验证 Ms. Brown 可以看到什么数据来检查访问权限。
创建仅管理员可访问的集合
我们将创建一个集合来存储用于限制 Ms. Brown 对 Products 表查看的 SQL 查询。我们称之为 Restricted view questions,并为该集合设置权限,以便只有管理员可以策划其问题。这样,非管理员就无法更改问题并改变受限视图的“维度”,例如通过包含 Ms. 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 ({{user_id}})]]
此查询的作用
- 返回一个结果,其中包含 Products 表中的列:
Title、Category和Price。 - 检查产品是否唯一,即每个产品只有一行。
- 选择性地过滤此列表,仅显示已订购受限访问用户的产品的行。
WHERE 子句周围的双方括号 [[…]] 使该子句成为可选的。双花括号 {{user_id}} 定义了变量。当使用此问题来限制用户访问时,我们将使用此 {{user_id}} 变量。
让我们运行查询,得到此结果

现在,我们将此问题保存为 Products from Orders,将其存储在我们创建的 Restricted view questions 集合中,并选择不将该问题添加到仪表板。
再次强调一点:我们只选择了 Products 表中的列,因为我们的查询应该只返回我们要限制的表中的列。
使用已保存的问题限制 Products 表的视图
现在我们已经创建了 Products from Orders 问题,是时候限制 Products 表了。我们将设置权限,以便 Metabase 将我们在关于 行权限的文章中为 Ms. Brown 提供的 user_id 属性插入到我们已保存的 SQL 问题 Products from Orders 的 {{user_id}} 变量中。
我们将点击 齿轮图标,选择 管理员设置,然后点击 权限 选项卡。在左侧,“数据库”下,我们将点击 Sample Database 和 Products。
如果您已经完成了关于 行权限的教程,您应该已经将“所有用户”组的权限设置为“查看数据:已阻止”和“创建查询:仅限查询生成器”。如果还没有,您需要在设置“客户”组的权限之前 进行这些编辑。
由于 Ms. Brown 是客户组的成员,并且 Metabase 授予数据权限给组而不是个人,我们将限制客户组对 Products 表的访问。点击“客户”组在“查看数据”列中的下拉菜单,然后选择 行和列安全性。

当 Metabase 询问 您想如何过滤此表? 时,我们将选择第二个过滤选项:使用已保存的问题创建表的自定义视图。
我们将导航到我们仅管理员可访问的 Restricted view questions 集合,并选择我们的问题 Products from Orders。对于 参数或变量,我们将选择我们在 SQL 查询中包含的变量 {{user_id}}。对于 用户属性,我们将选择 user_id。

我们的摘要现在显示
- 客户组中的用户
- 可以查看
Products from Orders问题中的行 - 其中
user_id变量的值等于user_id属性。
让我们点击模态框中的 保存,然后点击通知栏中的 保存更改 来确认我们的更改。
以受限用户的身份检查设置
让我们从 Ms. Brown 的角度看看我们的受限 Products 表是什么样的。打开一个私密浏览器窗口,导航到我们的 Metabase,并以 Ms. Brown 的身份登录。
当我们在 数据浏览器中打开 Products 表时,我们可以确认 Ms. Brown 只能看到她订购的产品的列表,并且只能看到我们在已保存的 Products from Orders 问题中包含的三个列:Title、Category 和 Price。

如果 Ms. Brown 提问查询 Products 表,她仍然只能看到基于她订购的产品的结果。如果她有权访问包含她自定义视图之外列的问题,她会看到一个错误。
使用 SQL 问题创建表的自定义受限视图
虽然理论上你可以使用查询生成器问题来创建一个表的自定义视图,但你应该始终使用 SQL 问题。在后台,问题会根据我们问题中的 过滤器、汇总和 连接来创建 SQL 查询。当你创建一个基于查询生成器问题的自定义视图时,你可能没有意识到你赋予了人们访问的信息的全部范围。
回顾
使用问题限制行和列访问时
- 使用 SQL 问题.
- 确保你保存的 SQL 问题仅返回你打算限制的表中的列。
- 将用于创建自定义视图的问题保存在专门的仅管理员集合中。