排查行和列安全性问题
行和列安全性允许部分用户仅访问部分数据。为了实现行和列安全性,Metabase 会运行一个查询,根据用户的权限,筛选行和/或从表中选择一部分列;然后用户的查询会在初始查询的结果(即安全数据)上运行。
这些文章将帮助您了解行和列安全性如何工作:
如果您有其他数据访问问题,请参阅相关问题。
用户无法看到他们*应该*能够看到的表行
Metabase 是否正在按用户属性过滤行?
根本原因: 行安全性正在使用用户属性来过滤行。
采取的步骤
这是预期行为:使用用户属性过滤行是行安全性的工作方式。但是,如果您*不*希望 Metabase 过滤这些行,您需要执行以下操作之一:
- 移除行安全性(这将授予所有拥有该表访问权限的用户对所有行的完全访问权限)。转到 Admin(管理员) > Permissions(权限),并更改表的访问级别。
- 将用户添加到具有不同表权限的组(或创建组)。请参阅数据权限指南。
用户可以看到他们*不*应该看到的行
用户能够看到他们不应该看到的行有几个原因。
这些用户是否也在有权查看整个表的组中?
根本原因: 用户在有权查看表的组中,因此可以看到所有行,而不仅仅是受保护的行。
采取的步骤
对于相关人员,检查他们属于哪些组。是否有任何组有权访问您要保护的表?如果有,请将其从该组中删除。请记住,每个人都是“所有用户”组的成员;这就是为什么我们建议您撤销所有用户组的权限,并创建新组以有选择地将权限应用于您的数据源。
该问题是否可通过静态嵌入或公共共享获得?
根本原因:该问题是公共的。公共问题,即使是使用静态嵌入的问题,也无法受到保护。如果有人在未登录 Metabase 的情况下查看问题,Metabase 将缺少用于过滤数据的用户属性或组信息,因此它将显示所有结果。
采取的步骤:
在保护数据时,您应该*避免*公共共享。请参阅公共共享。
问题是用 SQL 编写的吗?
根本原因。您无法对具有 SQL 访问权限的用户应用行和列安全性。他们对数据库的访问权限与用于将 Metabase 连接到数据库的用户帐户具有相同的权限。即使您在 Metabase 中隐藏了表,具有数据库 SQL 访问权限的用户仍然能够查询这些表。也就是说,您无法对 SQL 问题应用行和列安全性。行和列安全性仅适用于在查询构建器中编写的问题。
采取的步骤
-
不要尝试对用 SQL 编写的问题应用行和列安全性,因为您不能这样做。
-
如果您想保护行或列,请避免将该用户添加到对该表具有 SQL 访问权限的组(或对该表具有任何其他更宽松访问权限的组)。
-
如果您想授予他们 SQL 访问权限,但仍限制他们可以看到的内容,您需要设置数据库权限,并通过具有受限访问权限的用户帐户连接该数据库。您可以多次将同一个数据库连接到 Metabase,每次连接都具有不同的访问级别,并将不同的连接暴露给不同的组。
问题是否正在从非 SQL 数据源检索数据?
根本原因: 行和列安全性不支持非 SQL 数据库。
采取的步骤
这里您能做的不多:如果您需要应用行和列安全性,您无法使用这些数据库。
如果使用单点登录 (SSO),用户属性是否正确?
根本原因:如果用户使用 SSO 登录,但预期属性未保存并可用,则行和列安全策略将拒绝访问。
采取的步骤:
我们关于使用 SAML 进行身份验证和使用 JWT 进行身份验证的文档解释了如何使用您的身份提供商将用户属性传递给 Metabase,这些(用户属性)可用于应用行和列安全性。
用户可以看到他们*不*应该看到的列
管理员是否忘记设置行和列安全性?
根本原因: 管理员在设置行和列安全性时没有限制对底层表的访问。
采取的步骤:
- 转到 Admin Panel(管理面板) > Permissions(权限)以查看相关表。
- 检查行和列安全性是否已设置,以及用于创建表自定义视图的问题是否排除了您不希望用户看到的列。
用于设置行和列安全性问题是否包含这些列?
根本原因: 用于应用行和列安全性问题包含了他们不应该看到的列。
采取的步骤:
确保您正在使用 SQL 问题来应用行和列安全性,并且没有包含您应该排除的列。
如果您使用查询构建器(即使用简单或自定义问题)构建问题,您可能会无意中引入额外的列。您可以通过在“笔记本编辑器”中查看问题并单击“查看 SQL”按钮来精确检查包含哪些列。但再次强调:如果您使用 SQL 问题来应用行和列安全性,这个问题就会消失。
此人是否在*另一个*对该表具有不同权限级别的组中?
根本原因: 您已使用问题对表应用了行和列安全性,但该用户也属于对该表具有更高访问权限的组。如果一个人属于多个组,他们将获得所有组中对数据源最宽松的访问权限。
采取的步骤:
将此人从所有对受保护表具有更高访问权限的组中移除。如果他们需要这些其他组的一些权限,您需要创建一个新组,并设置一组新权限,其中只对该表应用行和列安全性。
用户无法看到他们*应该*能够看到的列
他们的组是否对该表应用了行和列安全性?
根本原因: 他们只能访问已应用行和列安全性的表,其中只显示部分列。
采取的步骤:
将这些用户添加到具有表查看权限的组(或创建一个新组)。
管理员是否隐藏了表中的字段?
根本原因::管理员已隐藏了表中的字段。
采取的步骤
转到 Admin(管理) > Table Metadata(表元数据)并找到该表。检查以确保您希望可见的字段没有被隐藏。
字段是否重新映射以显示受限表中的信息?
根本原因: 如果用户具有行和列安全权限的表中的某个字段使用重新映射来显示用户无权访问的另一个表中的信息,他们将无法看到该表。例如,如果您已将 ID 字段重新映射以显示产品名称,但用户无权访问产品表,他们将无法看到该列。
采取的步骤
- 转到 Admin Panel(管理面板) > Table Metadata(表元数据)以查看相关字段。
- 如果值是从受限表重新映射的,请更改它,以便 Metabase 将使用表中的原始值。有关更多信息,请参阅元数据编辑。
问题是否可通过静态嵌入获取?
根本原因:静态嵌入默认会显示所有结果。虽然可以通过锁定参数来控制过滤,但静态嵌入仅取决于包含页面生成的令牌,而不是用户是否登录 Metabase。
采取的步骤:
由于用户必须登录 Metabase 才能应用行安全性,因此当您希望限制对表的行或列访问时,请避免使用静态嵌入。
用户无法看到他们应该能够看到的数据
某人应该能够在他们的查询中查看表中的某些值,但被拒绝访问或获得一个空结果集,而那里应该有数据。
根本原因:管理员限制了对表的访问。如果限制因错误而过于严格(例如,“无访问权限”),那么用户可能根本无法看到任何数据。
采取的步骤
- 通过转到 Admin Panel(管理面板)并查看相关表的 Permissions(权限)来检查组的访问级别。
- 如果此人不在有权访问该表的组中,请将其添加到有权访问该表的组中,或创建一个有权访问该表的新组并将其添加到该新组中。
无法查看受保护数据的用户是否在多个组中?
根本原因: 我们只允许对每个表应用一次行和列安全性:如果一个人是两个或多个具有不同权限的组的成员,那么确定是否允许访问的每个规则都会令人困惑。因此,我们只允许一个规则。
采取的步骤
管理员可以创建一个新组,以精确地捕获谁被允许访问什么。
您有其他问题吗?
阅读其他版本的 Metabase 的文档。