教程:Metabase 中的列级权限
学习如何使用保存的 SQL 查询向不同的人显示特定的行和列。
正在寻找有关列安全性的文档?请参阅文档:行和列安全性。
行和列安全性在专业版和企业版计划中可用,作为一种根据用户身份指定其可以访问哪些数据的方式。我们关于行级权限的文章介绍了如何根据用户的用户属性限制行。例如,我们创建了一个用户 Ms. Brown,并赋予她访问与她的user_id
属性匹配的People
和Orders
表中的行的权限。
在本文中,我们将介绍如何限制 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 from Orders
问题,是时候限制 Products
表了。我们将设置权限,以便 Metabase 将我们在行权限文章中赋予 Ms. Brown 的 user_id
属性插入到我们保存的 SQL 问题 Products from Orders
中的 {{user_id}}
变量中。
我们将点击齿轮图标,选择管理设置,然后点击权限选项卡。在左侧数据库下,我们将点击示例数据库
和产品
。
如果您已经完成了我们的行权限教程,则“所有用户”组的权限应设置为“查看数据:已阻止”和“创建查询:仅查询构建器”。如果不是,则需要进行这些修改,然后才能为“客户”组设置权限。
由于 Ms. Brown 是客户组成员,并且 Metabase 将数据权限授予组而非个人,因此我们将限制客户组对Products
表的访问。点击“客户”组“查看数据”列中的下拉菜单,选择行和列安全。
当 Metabase 询问您希望如何筛选此表?部分时,我们将选择第二个筛选选项:使用保存的问题为此表创建自定义视图。
我们将导航到我们仅限管理员的受限视图问题
集合,并选择我们的问题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 查询仅返回您打算限制的表中的列。
- 将用于创建自定义视图的问题保存在一个专用的仅限管理员的集合中。