行和列安全示例

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

行和列安全 允许您

以下所有示例的设置

下面的示例使用了 Metabase 附带的 Sample 数据库。这是基本设置

  1. 阻止“所有用户”组的权限:按 cmd/ctrl + k 调出命令面板并搜索“Permissions”。在Permissions > Data 选项卡中。单击All users组。对于 Sample 数据库,将所有用户的 View data 权限设置为“Blocked”。

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

  3. 为 Cloyd Beer 创建一个用户账户。我们将创建一个用户账户,该用户账户来自我们 Sample 数据库中的 People 表中的一个随机人物。让我们选择 Sample 数据库 People 表中的 Cloyd Beer

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

User details

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

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

基于用户属性过滤行

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

  1. 转到 Admin settings > Permissions > data。单击“Customers”组。

  2. 将 View data 设置为 Granular。对于 Sample Database,将 Customer 组的View data 设置为“Granular”。设置为“Granular”后,我们将能够为 Customer 组设置单个表的权限。

  3. 为 Orders 和 People 表添加行和列安全设置。在这里,我们将 Orders 和 People 表的 View data 权限设置为“Row and column security”。由于我们希望用户能够自助服务(通过提问、创建仪表板等),因此我们还将他们的Create queries 权限设置为“Query builder only”。

Set row and column security

  1. 按每张表的列进行过滤。。对于每张表,Metabase 都会询问我们“如何为该组中的用户过滤此表?”。在每种情况下,我们都将保留默认选择:“Filter by a column on this table.”。对于 Orders 表,我们将按 User ID 列进行过滤,并将其设置为等于 Customers 组中人员的 user_id 属性。

Select user attribute

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

  1. 保存更改。否则,一切都将徒劳。

测试行安全

为了测试 Beer 先生的世界观,我们将打开一个新的隐身/私密浏览器窗口,并使用 Beer 先生的账户登录。

  1. 以 Cloyd Beer 的身份登录。
  2. 点击Browse > Databases
  3. 点击Orders表。
  4. 确认 Metabase 只显示 Beer 先生下的订单,即与 User 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

我们将此问题命名为“Filtered people table”。将其保存到您在设置中创建的“Admins collection”(或任何只有管理员可以访问的集合)。

  1. 使用 SQL 问题创建表的自定义视图:我们将转到 Permissions 部分,授予此组对该表的行和列安全。这次我们将选择第二个选项,“Use a saved question to create a custom view for this table”,然后选择我们刚创建的问题(“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. 创建自定义视图:返回Permissions选项卡。选择 Cloyd Beer 的 Customer 组,并将 Orders 表的View data访问权限设置为Row and column security。选择Use a saved question to create a custom view for this table。打开行和列安全模式,然后选择第二个选项。选择过滤问题,我们将看到一个附加部分,允许我们将问题中定义的变量映射到用户属性

  2. 保存您的更改。否则,希望尽失。

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

Results

延伸阅读

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

这有帮助吗?

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