教程:Metabase 中的行级权限
了解如何根据用户属性设置行级权限。
正在寻找关于行级安全性的文档?请参阅 文档:行和列安全性。
Metabase 的 Pro 和 Enterprise 套餐 包含 行和列安全性,可让您精细控制用户在问题中可以查看和使用的行和列。
在本文中,我们将通过一个示例,介绍如何使用 Metabase 随附的 示例数据库 设置 行级安全性。有关列级权限,请参阅 列级安全性。
行和列安全以前称为数据沙盒。这是同一个功能,只是现在有了更具描述性的名称。
设置行安全性之前
您应该备份 您的 Metabase 应用程序数据。此外,您可能需要查看我们的 数据权限指南、集合权限指南 以及我们的 权限概述,以更好地了解行和列安全性如何融入 Metabase 的权限系统。
我们的场景
我们的目标是确保客户 Ms. Brown 只能看到与她账户相关的表格行。
创建客户组
Metabase 使用组来组织权限,因此我们首先需要 创建一个组,我们将其命名为“Customers”。为此,请点击导航侧边栏中的 **齿轮图标**,然后选择 > **管理员设置** > **人员** > **组**。然后选择 **创建组**。

创建账户并添加属性
在为 Customers 组设置行级安全性之前,我们需要为 Ms. Brown 创建一个账户,并向她的账户添加一个属性。在 **管理员设置** > **人员** 选项卡中,点击 **邀请某人**,填写姓名和电子邮件字段,并将其添加到 Customers 组。
这里是关键部分:我们将为新用户 Ms. Brown 添加一个属性,键为 user_id,值为 20。

user_id 键没有什么神奇之处:它只是一个变量。我们可以添加任何我们选择的键值对的属性。我们想要做的是使用一个键来对应一个列,一个值来对应行值,用于我们想要限制的相关表格。其思路是我们将在属性与表格中的列关联起来,以确定 Ms. Brown 可以查看哪些行。
为了在本教程中演示,我们手动设置此属性,但我们可以使用单点登录服务 (SSO),例如 SAML,以编程方式为用户分配和同步属性。
限制组的行访问权限
现在我们有了我们的组,以及该组中至少有一位拥有属性的用户(Ms. Brown),我们就可以前往 数据权限页面 为示例数据库设置行级安全性了。
在左侧边栏中,我们将点击 **数据库** 和 **示例数据库**。要限制 Customer 组对 Orders 表的查看数据访问权限,我们只需点击 Orders 表,导航到 Customers 行,然后在 **查看数据** 列中,从下拉菜单中选择 **行和列安全性**。

如果您未编辑 **所有用户** 组的权限,您将看到一条警告消息,提示所有用户组的访问权限更高。

这意味着:如果一个人属于多个用户组,Metabase 将为他们选择 **最宽松** 的访问权限。由于您 Metabase 的所有用户始终属于“所有用户”组,这意味着如果“所有用户”组拥有更宽松的访问权限(例如,无限制的行访问权限),这将覆盖我们即将设置的行级安全性。因此,在设置完行级安全性后,我们需要更改“所有用户”组的权限。现在,点击警告上的 **撤销访问权限**。这只会为当前选定的组撤销表访问权限。
接下来,Metabase 将询问您是否要更改此 **数据库** 的访问权限。

请记住,我们只是为 Orders 表设置行级安全性。Metabase 询问整个数据库是因为我们的 Customers 组目前拥有写入原生 (SQL) 查询的权限。但 Metabase 不会解析用户编写的 SQL,因此它不知道正在查询哪些表 — 因而它也不知道拥有受限行访问权限的用户是否正在尝试查询受限表。这意味着对任何表具有行级限制的用户都不能允许其编写 SQL 查询,因此 Metabase 会警告您它将移除 SQL 查询权限。点击 **更改** 以从 Customers 组移除示例数据库的本机查询权限。
最后,Metabase 将询问您“您想如何过滤此表的用户?”并提供两个选项
- 按表格中的列进行过滤。
- 使用保存的问题为该表创建自定义视图。
目前,我们将设置保留为 **按表格中的列进行过滤** — 使用保存的问题是更高级的功能,我们将在 此处 讨论它。

对于列,我们将选择 Orders 表的 User ID 列,并将其连接到我们已分配给用户的属性下拉菜单中的 user_id 属性。
Metabase 将为我们提供所做更改的摘要:“Customers 中的用户可以在 Orders 表中查看行,其中 User ID 字段等于 user_id。”让我们保存更改,然后对 People 表重复此过程。
- 为 Customers 组选择
People表的“行和列安全性”权限。 - 选择 **按列过滤** 选项。
- 选择
People表的ID列,并将其连接到user_id属性。 - 查看摘要并保存。
最后,我们需要点击 **保存更改** 按钮来确认我们的更改。
从所有用户组撤销访问权限
在设置行级安全性时,Metabase 警告我们,所有用户组的访问权限更高,这将覆盖我们为 Customers 设置的规则。因此,我们需要从所有用户组撤销访问权限。
请记住,这意味着所有不属于 Customers 或 Admin 组的人都将失去对表的访问权限,因此,如果您的 Metabase 中有更多用户,您应该在撤销所有用户组的访问权限之前,先为他们设置组和权限。
进入示例数据库的权限设置(就像为 Customers 所做的那样),并将 **查看数据** 权限设置为 **阻止**。请注意,这还将从该组中移除任何查询权限。
以 Ms. Brown 的视角检查设置
现在让我们测试一下我们的设置,以确认我们的客户 Ms. Brown 只能看到与她用户 ID 相关的订单。我们将在隐身浏览器窗口中打开我们的 Metabase 实例,并以 Ms. Brown 的身份登录。当我们导航到 Orders 表时,Ms. Brown 将只能看到她下的订单(用户 ID 20)。

通过行级安全性,我们可以创建一个单一的问题或仪表板,并确信对该数据具有受限行访问权限的用户只能看到与其账户相关的数据。
如果我们结合行级安全性与 嵌入,我们可以将这些仪表板嵌入到我们的应用程序中,并使用 SSO 将属性传递到嵌入的 Metabase 实例,从而允许我们限制人们在嵌入到我们应用程序中的问题和仪表板上看到哪些数据。要了解更多信息,请参阅 如何将 Metabase 嵌入您的应用以提供多租户、自助分析。
用户属性的行级安全性局限性
- 每个用户对每个表只能有一种行和列安全性配置,因此只能将用户添加到单个具有受限行或列访问权限的组中。
- 如果一个组对数据库具有 SQL 查询访问权限,行级安全性策略无法阻止该组中的用户查看这些表中的数据。
- 因此,如果该组中的用户有权访问用 SQL 编写的问题,这些问题将无法识别行级安全性策略,并将向该组中的用户显示所有结果,而不仅仅是受行级安全性策略限制的结果。
了解更多关于 行和列安全性局限性 的信息。