行和列安全示例
行和列安全仅在 Pro 和 Enterprise 计划中可用(包括自托管和 Metabase Cloud)。
行和列安全让您可以:
下面所有示例的设置
以下示例使用 Metabase 附带的示例数据库。以下是基本设置:
-
阻止“所有用户”组的权限:按 cmd/ctrl + k 调出命令面板并搜索“权限”。在权限 > 数据选项卡中,点击所有用户组。对于示例数据库,将“所有用户”的查看数据权限设置为“已阻止”。
-
创建一个名为 Customers 的组。按 cmd/ctrl + k 并搜索 People 设置。[创建一个名为“Customers”的组。
-
为 Cloyd Beer 创建一个用户帐户。我们将为示例数据库中 People 表里的一个随机人员创建一个用户帐户。让我们选择示例数据库
People
表中的Cloyd Beer
。 -
为该帐户添加一个用户属性:我们将为 Cloyd 的帐户添加一个用户属性。由于我们希望能够按用户 ID 筛选数据,我们将从示例数据库的
People
表中获取 Cloyd 的 ID,并将该 ID 添加为用户属性:user_id: 2499
(2499
是 Beer 先生在示例数据库中的 ID)。
-
将 Beer 先生添加到 Customers 组:请参阅将人员添加到组。
-
创建一个仅对管理员可见的集合。将其命名为“Admin collection”。我们将使用此集合来存储在示例 2 和 3 中用于保护表的 SQL 问题。请参阅集合权限。
根据用户属性筛选行
在此示例中,我们将保护我们的 Orders
表,以便 Customers 组中的任何人只能看到 Orders 表中 User ID
列与其 user_id
属性相匹配的行。
-
转到管理设置 > 权限 > 数据。点击“Customers”组。
-
将“查看数据”设置为“精细”。对于示例数据库,将 Customer 组的查看数据权限设置为“精细”。设置为“精细”将允许我们为 Customer 组在单个表上设置权限。
-
为 Orders 和 People 表添加行和列安全。在这里,我们将
Orders
和People
表的“查看数据”权限设置为“行和列安全”。由于我们希望人们能够自助服务数据(通过提出问题、创建仪表板等),我们还将他们的创建查询权限设置为“仅查询构建器”。
- 按每个表的列进行筛选。对于每个表,Metabase 会询问我们“您希望如何为此组中的用户筛选此表?”。在每种情况下,我们都将保留默认选择:“按此表上的列筛选”。对于
Orders
表,我们将按User ID
列进行筛选,并将其设置为等于 Customers 组中人员的user_id
属性。
对于 People
表,我们将按 ID
列进行筛选,并将其设置为等于相同的 user_id
属性。
- 保存您的更改。否则,一切都将付之东流。
测试行安全
要测试 Beer 先生的视野,我们将打开一个新的隐身/隐私浏览器窗口,并使用 Beer 先生的帐户登录。
- 以 Cloyd Beer 的身份登录。
- 点击浏览 > 数据库。
- 点击 Orders 表。
- 确认 Metabase 仅显示 Beer 先生下的订单,即与用户 ID 为
2499
相关的订单。
如果 Beer 先生查看任何包含受保护的 Orders
数据的图表、仪表板,甚至是自动化的X-ray 探索,Metabase 也会筛选这些结果,仅显示 Beer 先生有权查看的数据。当 Beer 先生使用查询构建器提出新问题时,他的结果将仅限于筛选后的数据。
使用问题定义表的自定义视图
您可以设置行和列安全,以便当该组中的某人查询表时,Metabase 会在后台使用您创建的问题作为其查询的源数据。
您可以
自定义示例 1:筛选列
在此示例中,我们有一个名为 People
的表,我们希望对其进行精简,以便 Beer 先生和其他客户可以查看任何行,但只能查看某些列。
- 创建一个限制 People 表中列的查询。使用原生/SQL 编辑器,我们将编写一个查询,只返回我们希望 Customers 组看到的列,如下所示:
SELECT
id AS "ID",
name AS "Name",
created_at AS "Created At",
state AS "State"
FROM
People
以下是结果
我们将这个问题称为“筛选后的人员表”。将其保存到您在设置中创建的“Admins collection”(或任何只有管理员有权访问的集合)中。
- 使用 SQL 问题为此表创建自定义视图:我们将转到“权限”部分,并授予此组对此表的行和列安全权限。这次我们将选择第二个选项,“使用已保存的问题为此表创建自定义视图”,然后选择我们刚刚创建的问题(“Filtered people table”),如下所示:
-
保存更改,以免我们的辛劳白费。
-
验证一切是否正常工作。我们可以以 Beer 先生的身份登录,当我们打开
People
表时,我们应该看到 Beer 先生看到的是筛选问题的结果。
当 Beer 先生查看使用此受保护表数据的图表时,Metabase 也会应用筛选。如果图表使用了受保护表排除的任何列,则该图表将不会为 Beer 先生加载。
自定义示例 2:筛选行和列
如果我们想指定人们可以查看哪些列和行,我们可以基于带有变量的 SQL 问题对表应用行和列安全,并将该变量与用户属性关联起来。为此,我们将为 Customers 组提供 Orders
表的自定义视图,但只让他们根据其 user_id
用户属性查看行。
- 创建一个带有变量的 SQL 问题。我们将创建一个查询,仅从
Orders
表中选择部分列,然后添加一个带有变量的WHERE
子句,该变量可以与 Cloyd Beer 的user_id
用户属性关联。
这是代码
SELECT
id,
created_at,
product_id,
quantity,
total,
user_id
FROM
orders
WHERE
user_id = {{user_id}}
将其保存到您在设置中创建的“Admins collection”(或任何只有管理员有权访问的集合)中。
-
创建自定义视图:返回权限选项卡。选择 Cloyd Beer 的 Customer 组,并将
Orders
表的查看数据访问权限设置为行和列安全。选择使用已保存的问题为此表创建自定义视图。打开行和列安全模式并选择第二个选项。选择筛选问题后,我们将看到一个额外的部分,允许我们将问题中定义的变量与用户属性进行映射: -
保存您的更改。否则,一切希望都将破灭。
-
验证权限是否正常工作:现在,当我们以 Beer 先生的身份登录并查看
Orders
表时,Beer 先生将只看到我们在筛选问题中包含的列,并且行是按照问题WHERE
子句中变量的指定进行筛选的:
延伸阅读
阅读其他版本的 Metabase 的文档。