行和列安全示例
行和列安全仅在 Pro 和 Enterprise 计划中可用(包括自托管和 Metabase Cloud)。
行和列安全 允许您
以下所有示例的设置
下面的示例使用了 Metabase 附带的 Sample 数据库。这是基本设置
-
阻止“所有用户”组的权限:按 cmd/ctrl + k 调出命令面板并搜索“Permissions”。在Permissions > Data 选项卡中。单击All users组。对于 Sample 数据库,将所有用户的 View data 权限设置为“Blocked”。
-
创建一个名为 Customers 的组。按 cmd/ctrl + k 并搜索 People 设置。[创建一个名为“Customers”的组。
-
为 Cloyd Beer 创建一个用户账户。我们将创建一个用户账户,该用户账户来自我们 Sample 数据库中的 People 表中的一个随机人物。让我们选择 Sample 数据库
People表中的Cloyd Beer。 -
为账户添加用户属性:我们将为 Cloyd 的账户添加一个用户属性。由于我们希望能够按用户 ID 过滤数据,因此我们将从 Sample 数据库的
People表中获取 Cloyd 的 ID,并将该 ID 添加为用户属性:user_id: 2499(2499是 Beer 先生在 Sample 数据库中的 ID)。

-
将 Beer 先生添加到 Customers 组:请参阅将人员添加到组。
-
创建一个仅限管理员查看的集合。。称之为“Admin collection”。我们将使用此集合来存储我们在示例 2 和 3 中用于保护表的 SQL 问题。请参阅集合权限。
基于用户属性过滤行
在此示例中,我们将保护我们的 Orders 表,以便 Customers 组中的任何人只能查看 Orders 表中 User ID 列与该人的 user_id 属性匹配的行。
-
转到 Admin settings > Permissions > data。单击“Customers”组。
-
将 View data 设置为 Granular。对于 Sample Database,将 Customer 组的View data 设置为“Granular”。设置为“Granular”后,我们将能够为 Customer 组设置单个表的权限。
-
为 Orders 和 People 表添加行和列安全设置。在这里,我们将 Orders 和 People 表的 View data 权限设置为“Row and column security”。由于我们希望用户能够自助服务(通过提问、创建仪表板等),因此我们还将他们的Create queries 权限设置为“Query builder only”。

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

对于 People 表,我们将按 ID 列进行过滤,并将其设置为等于相同的 user_id 属性。
- 保存更改。否则,一切都将徒劳。
测试行安全
为了测试 Beer 先生的世界观,我们将打开一个新的隐身/私密浏览器窗口,并使用 Beer 先生的账户登录。
- 以 Cloyd Beer 的身份登录。
- 点击Browse > Databases。
- 点击Orders表。
- 确认 Metabase 只显示 Beer 先生下的订单,即与 User 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
这是结果

我们将此问题命名为“Filtered people table”。将其保存到您在设置中创建的“Admins collection”(或任何只有管理员可以访问的集合)。
- 使用 SQL 问题创建表的自定义视图:我们将转到 Permissions 部分,授予此组对该表的行和列安全。这次我们将选择第二个选项,“Use a saved question to create a custom view for this table”,然后选择我们刚创建的问题(“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”(或任何只有管理员可以访问的集合)。
-
创建自定义视图:返回Permissions选项卡。选择 Cloyd Beer 的 Customer 组,并将
Orders表的View data访问权限设置为Row and column security。选择Use a saved question to create a custom view for this table。打开行和列安全模式,然后选择第二个选项。选择过滤问题,我们将看到一个附加部分,允许我们将问题中定义的变量映射到用户属性 -
保存您的更改。否则,希望尽失。
-
验证权限是否正常工作:现在,当我们以 Beer 先生的身份登录并查看
Orders表时,Beer 先生将只能看到我们在过滤问题中包含的列,并且行会按照问题WHERE子句中变量的指定进行过滤

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