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