行和列安全示例

行和列安全仅在 ProEnterprise 计划中可用(包括自托管和 Metabase Cloud)。

行和列安全让您可以:

下面所有示例的设置

以下示例使用 Metabase 附带的示例数据库。以下是基本设置:

  1. 阻止“所有用户”组的权限:按 cmd/ctrl + k 调出命令面板并搜索“权限”。在权限 > 数据选项卡中,点击所有用户组。对于示例数据库,将“所有用户”的查看数据权限设置为“已阻止”。

  2. 创建一个名为 Customers 的组。按 cmd/ctrl + k 并搜索 People 设置。[创建一个名为“Customers”的组。

  3. 为 Cloyd Beer 创建一个用户帐户。我们将为示例数据库中 People 表里的一个随机人员创建一个用户帐户。让我们选择示例数据库 People 表中的 Cloyd Beer

  4. 为该帐户添加一个用户属性:我们将为 Cloyd 的帐户添加一个用户属性。由于我们希望能够按用户 ID 筛选数据,我们将从示例数据库的 People 表中获取 Cloyd 的 ID,并将该 ID 添加为用户属性user_id: 24992499 是 Beer 先生在示例数据库中的 ID)。

User details

  1. 将 Beer 先生添加到 Customers 组:请参阅将人员添加到组

  2. 创建一个仅对管理员可见的集合。将其命名为“Admin collection”。我们将使用此集合来存储在示例 2 和 3 中用于保护表的 SQL 问题。请参阅集合权限

根据用户属性筛选行

在此示例中,我们将保护我们的 Orders 表,以便 Customers 组中的任何人只能看到 Orders 表中 User ID 列与其 user_id 属性相匹配的行。

  1. 转到管理设置 > 权限 > 数据。点击“Customers”组。

  2. 将“查看数据”设置为“精细”。对于示例数据库,将 Customer 组的查看数据权限设置为“精细”。设置为“精细”将允许我们为 Customer 组在单个表上设置权限。

  3. 为 Orders 和 People 表添加行和列安全。在这里,我们将 OrdersPeople 表的“查看数据”权限设置为“行和列安全”。由于我们希望人们能够自助服务数据(通过提出问题、创建仪表板等),我们还将他们的创建查询权限设置为“仅查询构建器”。

Set row and column security

  1. 按每个表的列进行筛选。对于每个表,Metabase 会询问我们“您希望如何为此组中的用户筛选此表?”。在每种情况下,我们都将保留默认选择:“按此表上的列筛选”。对于 Orders 表,我们将按 User ID 列进行筛选,并将其设置为等于 Customers 组中人员的 user_id 属性。

Select user attribute

对于 People 表,我们将按 ID 列进行筛选,并将其设置为等于相同的 user_id 属性。

  1. 保存您的更改。否则,一切都将付之东流。

测试行安全

要测试 Beer 先生的视野,我们将打开一个新的隐身/隐私浏览器窗口,并使用 Beer 先生的帐户登录。

  1. 以 Cloyd Beer 的身份登录。
  2. 点击浏览 > 数据库
  3. 点击 Orders 表。
  4. 确认 Metabase 仅显示 Beer 先生下的订单,即与用户 ID 为 2499 相关的订单。

如果 Beer 先生查看任何包含受保护的 Orders 数据的图表、仪表板,甚至是自动化的X-ray 探索,Metabase 也会筛选这些结果,仅显示 Beer 先生有权查看的数据。当 Beer 先生使用查询构建器提出新问题时,他的结果将仅限于筛选后的数据。

使用问题定义表的自定义视图

您可以设置行和列安全,以便当该组中的某人查询表时,Metabase 会在后台使用您创建的问题作为其查询的源数据。

您可以

自定义示例 1:筛选列

在此示例中,我们有一个名为 People 的表,我们希望对其进行精简,以便 Beer 先生和其他客户可以查看任何行,但只能查看某些列。

Original People table

  1. 创建一个限制 People 表中列的查询。使用原生/SQL 编辑器,我们将编写一个查询,只返回我们希望 Customers 组看到的列,如下所示:
SELECT
  id AS "ID",
  name AS "Name",
  created_at AS "Created At",
  state AS "State"
FROM
  People

以下是结果

Filtering question

我们将这个问题称为“筛选后的人员表”。将其保存到您在设置中创建的“Admins collection”(或任何只有管理员有权访问的集合)中。

  1. 使用 SQL 问题为此表创建自定义视图:我们将转到“权限”部分,并授予此组对此表的行和列安全权限。这次我们将选择第二个选项,“使用已保存的问题为此表创建自定义视图”,然后选择我们刚刚创建的问题(“Filtered people table”),如下所示:

Using a question to create a custom view

  1. 保存更改,以免我们的辛劳白费。

  2. 验证一切是否正常工作。我们可以以 Beer 先生的身份登录,当我们打开 People 表时,我们应该看到 Beer 先生看到的是筛选问题的结果。

当 Beer 先生查看使用此受保护表数据的图表时,Metabase 也会应用筛选。如果图表使用了受保护表排除的任何列,则该图表将不会为 Beer 先生加载。

自定义示例 2:筛选行和列

如果我们想指定人们可以查看哪些列行,我们可以基于带有变量的 SQL 问题对表应用行和列安全,并将该变量与用户属性关联起来。为此,我们将为 Customers 组提供 Orders 表的自定义视图,但只让他们根据其 user_id 用户属性查看行。

  1. 创建一个带有变量的 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”(或任何只有管理员有权访问的集合)中。

  1. 创建自定义视图:返回权限选项卡。选择 Cloyd Beer 的 Customer 组,并将 Orders 表的查看数据访问权限设置为行和列安全。选择使用已保存的问题为此表创建自定义视图。打开行和列安全模式并选择第二个选项。选择筛选问题后,我们将看到一个额外的部分,允许我们将问题中定义的变量与用户属性进行映射:

  2. 保存您的更改。否则,一切希望都将破灭。

  3. 验证权限是否正常工作:现在,当我们以 Beer 先生的身份登录并查看 Orders 表时,Beer 先生将只看到我们在筛选问题中包含的列,并且行是按照问题 WHERE 子句中变量的指定进行筛选的:

Results

延伸阅读

阅读其他版本的 Metabase 的文档。

这有帮助吗?

感谢您的反馈!
想改进这些文档吗?提出更改建议。
© . This site is unofficial and not affiliated with Metabase, Inc.