教程:Metabase 中的列级权限

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

正在查找关于列安全性的文档?请参阅 文档:行和列安全性

行和列安全性在 Pro 和 Enterprise 版本中可用,作为根据用户身份指定他们可以访问哪些数据的方式。我们关于 行级别权限的文章介绍了如何基于用户的属性限制行。例如,我们创建了一个名为 Ms. Brown 的用户,并授予她访问 PeopleOrders 表中与其 user_id 属性匹配的行的权限。

在本文中,我们将介绍如何限制 Ms. Brown 可以查看的 Products 表的行和列。在这种情况下,我们希望 Ms. Brown

  • 仅在 Products 表中查看她下过订单的产品(行级别安全性)
  • 仅查看 TitleCategoryPrice 列(而不是其他任何列)。

行和列安全以前称为数据沙盒。这是同一个功能,只是现在有了更具描述性的名称。

计划

我们将

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

  2. 创建一个新的 SQL 查询。Products 表不包含用户信息。因此,要限制 Ms. Brown 对 Products 表的访问,我们需要找出 Ms. Brown 订购了哪些产品。我们将编写一个 SQL 查询,该查询将 Products 表的数据与 Orders 表的数据相结合。通过结合这两个表,我们将创建一个仅包含我们想要的新表格结果。

  3. 通过显示我们查询的结果而不是原始表来限制 Ms. Brown 对 Products 表的查看。

  4. 通过验证 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 表中的列:TitleCategoryPrice
  • 检查产品是否唯一,即每个产品只有一行。
  • 选择性地过滤此列表,仅显示已订购受限访问用户的产品的行。

WHERE 子句周围的双方括号 [[…]] 使该子句成为可选的。双花括号 {{user_id}} 定义了变量。当使用此问题来限制用户访问时,我们将使用此 {{user_id}} 变量。

让我们运行查询,得到此结果

SQL query to create new table.

现在,我们将此问题保存为 Products from Orders,将其存储在我们创建的 Restricted view questions 集合中,并选择不将该问题添加到仪表板。

再次强调一点:我们只选择了 Products 表中的列,因为我们的查询应该只返回我们要限制的表中的列。

使用已保存的问题限制 Products 表的视图

现在我们已经创建了 Products from Orders 问题,是时候限制 Products 表了。我们将设置权限,以便 Metabase 将我们在关于 行权限的文章中为 Ms. Brown 提供的 user_id 属性插入到我们已保存的 SQL 问题 Products from Orders{{user_id}} 变量中。

我们将点击 齿轮图标,选择 管理员设置,然后点击 权限 选项卡。在左侧,“数据库”下,我们将点击 Sample DatabaseProducts

如果您已经完成了关于 行权限的教程,您应该已经将“所有用户”组的权限设置为“查看数据:已阻止”和“创建查询:仅限查询生成器”。如果还没有,您需要在设置“客户”组的权限之前 进行这些编辑

由于 Ms. Brown 是客户组的成员,并且 Metabase 授予数据权限给组而不是个人,我们将限制客户组对 Products 表的访问。点击“客户”组在“查看数据”列中的下拉菜单,然后选择 行和列安全性

Set up access to the Products table for the Customer group.

当 Metabase 询问 您想如何过滤此表? 时,我们将选择第二个过滤选项:使用已保存的问题创建表的自定义视图。

我们将导航到我们仅管理员可访问的 Restricted view questions 集合,并选择我们的问题 Products from Orders。对于 参数或变量,我们将选择我们在 SQL 查询中包含的变量 {{user_id}}。对于 用户属性,我们将选择 user_id

Configuring column security

我们的摘要现在显示

  • 客户组中的用户
  • 可以查看 Products from Orders 问题中的行
  • 其中 user_id 变量的值等于 user_id 属性。

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

以受限用户的身份检查设置

让我们从 Ms. Brown 的角度看看我们的受限 Products 表是什么样的。打开一个私密浏览器窗口,导航到我们的 Metabase,并以 Ms. Brown 的身份登录。

当我们在 数据浏览器中打开 Products 表时,我们可以确认 Ms. Brown 只能看到她订购的产品的列表,并且只能看到我们在已保存的 Products from Orders 问题中包含的三个列:TitleCategoryPrice

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

如果 Ms. Brown 提问查询 Products 表,她仍然只能看到基于她订购的产品的结果。如果她有权访问包含她自定义视图之外列的问题,她会看到一个错误。

使用 SQL 问题创建表的自定义受限视图

虽然理论上你可以使用查询生成器问题来创建一个表的自定义视图,但你应该始终使用 SQL 问题。在后台,问题会根据我们问题中的 过滤器汇总连接来创建 SQL 查询。当你创建一个基于查询生成器问题的自定义视图时,你可能没有意识到你赋予了人们访问的信息的全部范围。

回顾

使用问题限制行和列访问时

  • 使用 SQL 问题.
  • 确保你保存的 SQL 问题仅返回你打算限制的表中的列。
  • 将用于创建自定义视图的问题保存在专门的仅管理员集合中。

延伸阅读

这有帮助吗?

感谢您的反馈!
订阅新闻通讯
Metabase 的更新和新闻
© . This site is unofficial and not affiliated with Metabase, Inc.