教程:Metabase 中的行级权限
学习如何根据用户的属性设置行级权限。
正在寻找行级安全文档?请参阅文档:行和列安全。
Metabase 的专业版和企业版计划包含行和列安全,可让您对用户在提问中可以查看和使用的行和列进行精细控制。
在本文中,我们将通过一个示例来设置行级安全,使用 Metabase 中包含的示例数据库。有关列级权限,请参阅列级安全。
行和列安全以前称为数据沙盒。这是同一个功能,只是现在有了更具描述性的名称。
设置行安全之前
您应该备份您的 Metabase 应用程序数据。此外,您可能需要查看我们的数据权限指南、集合权限指南以及我们的权限概述,以便更好地了解行和列安全如何融入 Metabase 的权限系统。
我们的场景
我们的目标是确保客户布朗女士只能看到与其账户相关的表格行。
创建客户组
Metabase 使用组来组织权限,因此我们首先需要创建一个组,我们将其命名为“客户”。为此,请单击导航侧边栏中的齿轮图标,然后选择 > 管理设置 > 人员 > 组。然后选择创建组。
创建帐户并添加属性
在为客户组设置行级安全之前,我们需要为布朗女士创建一个账户,并为她的账户添加一个属性。在管理设置 > 人员选项卡中,我们将点击邀请某人,填写姓名和电子邮件字段,然后将她添加到客户组。
这里是重要部分:我们将为我们的新用户布朗女士添加一个属性,其键为user_id
,值为20
。
user_id
键没有什么神奇之处:它只是一个变量。我们可以添加包含我们选择的任何键值对的属性。我们想要的是使用与列对应的键,以及与要限制的相关表的行值对应的值。我们的想法是将此属性链接到表中的一列,以确定布朗女士可以查看哪些行。
为了本次演练的目的,我们手动设置此属性,但我们可以使用单点登录服务 (SSO),例如 SAML 来以编程方式向用户分配和同步属性。
限制组的行访问
现在我们有了我们的组,并且该组中至少有一名成员(布朗女士)具有属性,我们已准备好前往数据权限页面,为示例数据库设置行级安全。
在左侧边栏中,我们将点击数据库和示例数据库。要限制客户组对Orders
表的“查看数据”访问权限,我们只需点击Orders
表,导航到客户行,并在查看数据列中,从下拉菜单中选择行和列安全。
如果您没有编辑“所有用户”组的权限,您将看到一条警告消息,提示“所有用户”组拥有更高的访问权限。
这意味着:如果一个人属于多个用户组,Metabase 会选择他们**最宽松的**访问权限。因为所有使用 Metabase 的人都始终属于“所有用户”组,这意味着如果“所有用户”组拥有更宽松的访问权限(例如,对行 unrestricted 访问),这将覆盖我们即将设置的行级安全。因此,在我们设置完行级安全后,我们需要更改“所有用户”组的权限。现在,请点击警告上的**撤销访问权限**。这只会撤销当前选定组的表访问权限。
接下来,Metabase 会询问您是否要更改此数据库的访问权限。
请记住,我们正在尝试为 Orders 表设置行级安全。Metabase 询问整个数据库的原因是我们的客户组目前拥有编写原生 (SQL) 查询的权限。但是 Metabase 不会解析人们编写的 SQL,因此它不知道正在查询哪些表——因此它将不知道具有受限行访问权限的人是否正在尝试查询受限表。这意味着对任何表具有行级限制的人都不能被允许编写 SQL 查询,因此 Metabase 会警告您它将删除 SQL 查询权限。单击更改以从客户组中删除示例数据库的原生查询权限。
最后,Metabase 会询问您“您希望如何为该组中的用户筛选此表?”,并提供两个选项
- 按表中某列筛选。
- 使用已保存的查询为此表创建自定义视图。
目前,我们将设置保留为按表中某列筛选——使用已保存的查询是更高级的功能,我们在此处进行讨论。
对于该列,我们将选择Orders
表中的User ID
列,并将其连接到我们已分配给用户的属性下拉菜单中的user_id
属性。
Metabase 将为我们提供所做更改的摘要:“客户组中的用户可以在Orders
表中查看User ID
字段等于user_id
的行。” 让我们保存更改并对People
表重复此过程。
- 为“人员”表的客户组选择“行和列安全”权限。
- 选择按列筛选选项。
- 选择“人员”表中的
ID
列,并将其连接到user_id
属性。 - 审查摘要并点击保存。
最后,我们需要点击保存更改按钮以确认我们的更改。
撤销“所有用户”组的访问权限
当我们设置行级安全时,Metabase 警告我们“所有用户”组具有更高的访问级别,这将覆盖我们为客户设置的规则。因此,我们需要撤销“所有用户”组的访问权限。
请记住,这意味着所有**不**在“客户”或“管理员”组中的人将失去对表的访问权限,因此如果您的 Metabase 中有更多人,您应该在撤销“所有用户”访问权限之前为他们设置组和权限。
进入示例数据库的权限设置(就像您为客户所做的那样),并将查看数据权限设置为已阻止。请注意,这也会删除该组的任何查询权限。
检查布朗女士所见的世界设置
现在让我们测试一下我们的设置,以确认我们的客户布朗女士只能看到与其用户 ID 相关的订单。我们将在隐身浏览器窗口中打开 Metabase 实例并以布朗女士的身份登录。当我们导航到Orders
表时,布朗女士将只看到她下的订单(用户 ID 20)。
通过行级安全,我们可以创建一个单一的问题或仪表板,并确保对该数据具有受限行访问权限的人员只能看到与其帐户相关的数据。
如果我们将行级安全与交互式嵌入结合使用,我们可以将这些仪表板嵌入到我们的应用程序中,并使用 SSO 将属性传递给嵌入的 Metabase 实例,从而限制人们在嵌入的应用程序中看到的问题和仪表板上的数据。要了解更多信息,请参阅如何将 Metabase 嵌入到您的应用程序中以提供多租户自助服务分析。
使用用户属性进行行级安全的限制
- 一个用户每张表只能有一个行和列安全配置,所以只将用户添加到一个具有受限行或列访问权限的组中。
- 如果一个组对数据库具有 SQL 查询访问权限,则行级安全策略无法阻止该组中的人员查看这些表中的数据。
- 推而广之,如果该组中的人员可以访问用 SQL 编写的问题,则这些问题不会意识到行级安全策略,并将向该组中的人员显示所有结果,而不仅仅是受行级安全策略限制的结果。
了解有关行和列安全限制的更多信息。