使用模拟通过 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_rolevermont_sales_team

Adding a user attribute to an account to specify which role Metabase should pass to the database.

将组的权限设置为模拟

您需要限制“所有用户”组的默认权限,然后为您的新组添加“模拟”权限。

  1. 转到**管理设置** > **权限** > **[您的数据库]**

  2. 限制“所有用户”组的权限。

    属于多个组的人员在所有组中都拥有被授予的最宽松的访问权限。 由于每个 Metabase 用户都属于“所有用户”组,因此我们需要限制“所有用户”组的权限,以使其不会覆盖佛蒙特州销售团队的“模拟”权限。

    通过设置来限制“所有用户”权限

    • “查看数据”为**已阻止**
    • “创建查询”为**否**。
  3. 对于“佛蒙特州销售团队”组,将“查看数据”权限更改为“已模拟”。

    Metabase 将要求您选择要传递到数据库的用户属性,因此请选择我们之前创建的 database_role 属性。

  4. 对于“佛蒙特州销售团队”组,将“创建查询”设置为“查询构建器和原生”。

    这些权限将允许“佛蒙特州销售团队”组创建查询构建器问题和原生 SQL 查询。

因此,您的数据库的权限设置将如下所示

Data access set to Impersonated with Native querying set to Yes.

验证模拟权限是否正常工作

以“佛蒙特州销售团队”组中的人员身份登录。 转到左侧导航栏中的**浏览数据**,然后转到**示例数据库**。 如果单击 **People** 表,您应该只能看到居住在佛蒙特州的人员。

当“佛蒙特州销售团队”组中的某人编写 SQL 问题时,也适用相同的权限。

SELECT * FROM people;

People who live in Vermont.

结果应该仅包括来自佛蒙特州的人员。 订阅和警报也应应用这些权限。

下一步:配置多租户数据权限

了解如何限制客户对行、列或模式的访问,以实现安全的自助分析。

下一篇文章