使用模拟通过 GUI 和 SQL 查询获取行级权限
在数据库中创建角色,并在查询数据库时让 Metabase 模拟这些角色。
模拟是 Pro/企业版功能,目前仅适用于 PostgreSQL、Redshift 和 Snowflake。
模拟是 Metabase 中的权限设置,可让您在数据库中管理权限。 通过模拟,您可以将用户属性一直传递到数据库层,这意味着您可以在数据库执行查询之前设置角色。
模拟 vs 沙箱
模拟为在 SQL 编辑器和查询构建器中编写的问题设置权限
模拟在数据库级别运行。 在数据库引擎中,在查询运行之前设置角色可能会更改查询结果,因为角色定义了数据库在执行语句时应使用的权限。
沙箱仅为查询构建器问题设置权限
沙箱在 Metabase 级别运行。 由于 Metabase 无法解析 SQL 查询以找出人们允许查看哪些数据,因此沙箱仅适用于在查询构建器中编写的问题(Metabase 可以在其中解释查询)。
模拟的用例示例
假设我们有一个 People 表,其中包含来自美国所有 50 个州的帐户行。
假设您希望您的佛蒙特州销售团队
- 能够使用查询构建器和原生 SQL 编辑器提问。
- 只能查看 People 表中居住在佛蒙特州的客户帐户。
首先,您需要在数据库中设置权限,方法是创建一个具有策略的角色。 然后,在 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 查询。
因此,您的数据库的权限设置将如下所示
验证模拟权限是否正常工作
以“佛蒙特州销售团队”组中的人员身份登录。 转到左侧导航栏中的**浏览数据**,然后转到**示例数据库**。 如果单击 **People** 表,您应该只能看到居住在佛蒙特州的人员。
当“佛蒙特州销售团队”组中的某人编写 SQL 问题时,也适用相同的权限。
SELECT * FROM people;
结果应该仅包括来自佛蒙特州的人员。 订阅和警报也应应用这些权限。
下一步:配置多租户数据权限
了解如何限制客户对行、列或模式的访问,以实现安全的自助分析。