使用模拟获取 GUI 和 SQL 查询的行级权限
在您的数据库中创建角色,并让 Metabase 在查询数据库时模拟这些角色。
模拟是 专业版/企业版 功能,目前仅适用于 PostgreSQL、Redshift 和 Snowflake。
模拟是 Metabase 中的一项权限设置,允许您在数据库中管理权限。通过模拟,您可以将用户属性一直传递到数据库层,这意味着您可以在数据库执行查询之前设置一个角色。
模拟 vs 数据沙盒
模拟为 SQL 编辑器和查询构建器中编写的问题设置权限
模拟在数据库级别运行。在数据库引擎中,在查询运行之前设置角色可以改变查询结果,因为该角色定义了数据库执行语句时应使用的权限。
数据沙盒仅为查询构建器问题设置权限
数据沙盒在 Metabase 级别运行。由于 Metabase 无法解析 SQL 查询以确定用户被允许查看哪些数据,因此数据沙盒仅适用于在查询构建器中编写的问题(Metabase 可以解释这些查询)。
模拟的用例示例
假设我们有一个“人员”表,其中包含来自美国所有 50 个州的用户账户行。
假设您希望您的佛蒙特州销售团队能够
- 能够使用查询构建器和原生 SQL 编辑器提问。
- 只能查看“人员”表中居住在佛蒙特州的客户账户。
首先,您将在数据库中通过创建具有策略的角色来设置权限。然后在 Metabase 中,您将把对该数据库的数据访问权限设置为模拟,这样当用户在该数据库上运行查询时,Metabase 将使用该角色来限制他们可以看到的数据。
在数据库中设置权限
假设您正在使用 Postgres,请使用任何 SQL 客户端(例如 psql)登录到您的数据库。
您将创建一个名为 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;
在 Metabase 中设置群组
在 Metabase 中,点击齿轮图标,然后前往管理设置 > 人员 > 群组。点击创建群组。将其命名为“佛蒙特州销售团队”。
将一个人添加到该群组(如果需要,可以创建一个测试用户)。
为用户账户添加属性
在管理设置中,前往人员并找到该用户的账户。编辑其账户并点击添加属性。
在这里,您将把一个属性与一个角色关联起来:将 database_role
与 vermont_sales_team
关联。
将群组权限设置为模拟
您需要限制“所有用户”群组的默认权限,然后为您的新群组添加模拟权限。
-
前往管理设置 > 权限 > [您的数据库]
-
限制“所有用户”群组的权限。
属于多个群组的用户拥有其所有群组中最宽松的访问权限。由于每个 Metabase 用户都属于“所有用户”群组,因此我们需要限制“所有用户”群组的权限,以防止它们覆盖佛蒙特销售团队的模拟权限。
通过设置来限制“所有用户”的权限:
- 查看数据设为已阻止
- 创建查询设为否。
-
对于“佛蒙特州销售团队”群组,将查看数据权限更改为“模拟”。
Metabase 将要求您选择要传递给数据库的用户属性,因此请选择我们之前创建的
database_role
属性。 -
对于“佛蒙特州销售团队”群组,将创建查询设为查询构建器和原生。
这些权限将允许“佛蒙特州销售团队”群组创建查询构建器问题和原生 SQL 查询。
因此,您的数据库的权限设置将如下所示
验证模拟权限是否生效
以“佛蒙特州销售团队”群组中的用户身份登录。前往左侧导航栏中的浏览数据,然后进入示例数据库。如果您点击人员表,您应该只能看到居住在佛蒙特州的人员。
当“佛蒙特州销售团队”群组中的用户编写 SQL 问题时,相同的权限也适用。
SELECT * FROM people;
结果应仅包含佛蒙特州的人员。订阅和警报也应应用这些权限。
下一步:配置多租户数据权限
了解如何限制客户对行、列或模式的访问,以实现安全的自助分析。