模拟权限
目前,模拟访问仅适用于 ClickHouse、MySQL、PostgreSQL、Redshift、Snowflake 和 SQL Server。如果您想根据登录用户切换数据库*连接*,请查看数据库路由。
如果您在 PostgresSQL 中使用视图,视图上的行级安全策略仅在 Postgres 15及更高版本中有效。
本页介绍名为“模拟”的查看数据权限级别。
模拟访问允许管理员将“查看数据”权限“外包”给数据库中的角色。管理员可以将用户属性与数据库定义的角色及其权限关联起来。如果某人所在的组的“查看数据”权限设置为“模拟”,那么该用户将能够根据其用户属性指定的角色所授予的权限来查看和查询数据。
模拟与行列级安全性对比
模拟为在 SQL 编辑器和查询构建器中编写的问题设置权限
模拟在数据库级别操作。在数据库引擎中,查询运行前设置角色可以改变查询结果,因为角色定义了数据库在执行语句时应使用的权限。
行列级安全性仅为查询构建器问题设置权限
行列级安全性在 Metabase 级别操作。由于 Metabase 无法解析 SQL 查询以了解人们被允许查看哪些数据,行列级安全性仅适用于在查询构建器中组合的问题(Metabase 可以解释这些查询)。
模拟用例示例
假设我们有一个 People 表,其中包含来自美国所有50个州的账户行。假设您希望您的佛蒙特州销售团队:
- 能够同时使用查询构建器和原生 SQL 编辑器提问。
- 只能查看 People 表中居住在佛蒙特州的客户账户。
首先,您将在数据库中通过创建带策略的角色来设置权限。然后在 Metabase 中,您将该数据库的数据访问权限设置为“模拟”,这样当人们查询该数据库时,Metabase 将使用该角色来限制他们能看到的数据。
设置连接模拟
要使模拟访问正常工作,您首先需要在数据库中设置角色供 Metabase 模拟,然后在 Metabase 中配置以在人们查看或查询数据时模拟这些角色。
为模拟设置 Metabase 数据库连接
模拟使用数据库角色在您的数据库上运行查询,但仍然需要一个默认角色来运行同步、扫描和指纹识别等操作。因此,Metabase 用于连接到您的数据库的用户帐户应有权访问该数据库中任何 Metabase 组可能需要访问的所有内容,因为该数据库用户帐户是 Metabase 用于同步表信息的。
然后,您可以在数据库中创建对数据库具有更严格访问权限的角色(如行级或表级安全性)。当通过模拟将角色传递给数据库时,引擎将返回数据的子集,或完全限制查询。
对于 **Redshift** 数据库,Metabase 用于连接到您的 Redshift 数据库的用户帐户必须是超级用户,因为 Metabase 需要能够运行 SET SESSION AUTHORIZATION 命令,该命令只能由数据库超级用户运行。
在您的数据库中设置角色
在您的数据库中(而不是在 Metabase 中)
- 创建一个新的数据库角色(在 Redshift 中,这将是一个新用户)。
- 授予该角色您希望被模拟用户拥有的权限。
有关如何在您的数据库中创建新角色并授予该角色权限的具体方法,您需要查阅您数据库的文档。我们也有一些关于用户、角色和权限的文档,可以帮助您入门。
例如,如果您使用 PostgreSQL,以下 SQL 将创建一个名为 vermont_sales_team
的角色,并只允许该角色选择 people
表中 state
列值为 VT
(佛蒙特州的缩写)的行。
CREATE ROLE vermont_sales_team;
GRANT
SELECT ON ALL TABLES IN SCHEMA PUBLIC TO vermont_sales_team;
CREATE POLICY vermont ON people
FOR
SELECT TO vermont_sales_team USING (state = 'VT');
ALTER TABLE people ENABLE ROW LEVEL SECURITY;
使用模拟时,Snowflake 连接应禁用二级角色
为了使模拟在 **Snowflake** 数据库上正常工作,Metabase 用于连接到您的 Snowflake 数据库的用户帐户必须禁用二级角色。您可以使用以下命令禁用二级角色:
ALTER USER metabase_user SET DEFAULT_SECONDARY_ROLES = ();
如果您不禁用二级角色,每个被模拟的角色也将获得您授予 Metabase 用户的所有其他角色的权限。
设置一个 Metabase 组
Metabase 中的权限(包括模拟)由组管理,因此您需要:
您可能想创建一个测试用户并将其添加到组中,以便稍后验证模拟是否正常工作。
为组中的人员分配用户属性
要将组中的人员与您在数据库中创建的角色关联起来,您将使用用户属性。
为您的组中的人员分配用户属性
- 属性的**键**可以是任何东西。
- 属性的**值**必须与每个人的期望数据库角色匹配。
例如,如果您在数据库中创建了一个名为 vermont_sales_team
的角色,并授予其访问与佛蒙特州销售团队相关的数据子集的权限(如上例所示),您可以添加一个名为 db_role
的用户属性(或任何您想命名的属性),并将值 vermont_sales_team
分配给该用户的 db_role
属性。
某些数据库区分大小写,因此您可能需要确保属性的值与数据库的角色完全匹配。
一个组中的人员可以有不同的属性值,但必须有相同的属性键。请参阅拥有模拟数据访问权限的组中的人员不一定共享相同的权限。
设置模拟
-
在 Metabase 中,按 Cmd/Ctrl + K 调出命令面板并搜索**权限**,或直接转到**管理设置** > **权限** > **数据**。
-
选择您要与您创建的数据库角色关联的组。
-
选择要配置访问权限的数据库。
-
在该数据库的**查看数据**设置下,选择**模拟**。此选项仅在您已经创建了用户属性的情况下可见。
如果您的“所有用户”组对此数据库有更宽松的访问权限(例如,“可以查看”),您将看到一个警告,因为Metabase 会给予人们其所有组中最宽松的数据访问权限。在设置模拟之前,您需要阻止“所有用户”组对数据库的访问。
-
从用户属性下拉菜单中,选择您添加的、映射到您希望该组在查询数据库时使用的角色的用户属性。
-
保存您的更改。
请记住,还要为您的组和数据库设置“创建查询”权限。例如,如果您希望人们能够在使用模拟数据库角色时编写 SQL,您需要将“创建查询”权限设置为“查询构建器和原生”。
验证模拟权限是否正常工作
管理员无法从自己的账户验证模拟是否正常工作,因此您应创建一个测试用户,将其添加到组中并设置其用户属性。
要验证模拟权限是否正常工作:
- 如果测试用户的“创建查询”权限设置为“创建查询和原生”,创建一个 SQL 问题并验证测试用户只能看到正确的数据。
例如,对于上例中的 vermont_sales_team
角色,您可以运行:
SELECT * FROM people;
以验证测试用户只看到来自佛蒙特州的数据。
- 如果测试用户的“创建查询”权限设置为“仅查询构建器”,请转到左侧边栏的**浏览数据**,并验证用户只能看到他们有权访问的表,以及这些表中仅有的数据。
拥有模拟数据访问权限的组中的人员不一定共享相同的权限
Metabase 将使用您在每个人的用户属性中指定的任何角色。例如,如果您选择 db_role
属性进行模拟,一个人的 db_role
可能是 sales
,另一个人的可能是 engineering
,或任何其他映射到您数据库中有效角色的值。
使用模拟设置行级 SQL 访问
您可以使用模拟来授予人们访问 SQL 编辑器的权限,同时根据特定的数据库角色限制他们对数据的访问。这不仅限于表级访问,还包括行级访问——或者您在数据库中为该角色定义的任何访问方式。实际上,您可以使用模拟来设置类似行和列安全性的数据访问权限,同时让人们使用 SQL 编辑器查询数据。不同之处在于,*您需要在数据库中通过授予角色的权限来设置行级安全性,而不是在 Metabase 中设置行和列安全性。*
如果您想授予一个组对数据库中部分(而非全部)模式或表的 SQL 访问权限,您可以在数据库中创建一个额外的角色,该角色只包含这些表的子集——甚至特定的行级访问权限——然后使用 Metabase 的模拟功能将用户属性与该角色关联起来。Metabase 的做法是,在执行查询*之前*,将用户属性作为字符串传递到数据库的 SET ROLE
或 USE ROLE
命令中。
连接模拟不适用于 Metabase 管理员组中的人员,因为他们更宽松的权限优先。
Metabase 会给予人们在其所有组中最宽松的数据访问权限
因此,如果一个人在两个对同一数据库有不同权限的组中:
- 红组具有模拟访问权限,限制了他们能看到的内容。
- 蓝组的“查看数据”设置为“可以查看”,且“创建查询”设置为“查询构建器和原生”。
蓝组更宽松的访问权限将覆盖模拟访问权限。
管理员不会看到模拟的效果
管理员永远不会看到模拟效果,因为他们的权限将覆盖他们所属的任何其他组的权限。
Metabase 的默认管理员组对所有数据库都拥有“可以查看”的访问权限,并且 Metabase 对任何身处多个组中的人都采用最宽松的访问权限,因此任何管理员都将拥有对数据库的“可以查看”而非“模拟”访问权限。
要测试模拟,请创建一个测试用户,为他们分配一个带有数据库角色的用户属性,并将他们添加到模拟组中。然后,以测试用户身份登录并验证数据访问权限。
阅读其他版本的 Metabase 的文档。