高级数据沙盒:限制对列的访问
了解如何使用已保存的SQL查询对表进行沙盒处理,并根据用户属性限制用户可以查看的列。
我们的文章行权限涵盖了沙盒(商业版本). 我们将沙盒定义为一种根据用户身份指定用户可以访问哪些数据的方法,并向您展示了如何限制对表行的访问。例如,我们创建了一个用户Brown女士,并让她访问People
和Orders
和她相配的数据表user_id
属性。
在本文中,我们将介绍如何对Products
限制表Brown女士可以看的行和列。在这种情况下,我们希望Brown女士:
- 只在
Products
表。 - 只看到
Title
,Category
, 和Price
列(而不是任何其他列)。
计划
我们要:
- 创建只有管理员才能访问的集合。
- 创建新的SQL查询。这个
Products
表
不包含有关用户的信息。所以为了限制Brown女士接触Products
我们得查一下Brown女士订了哪些产品。我们会写一个SQL语言从中组合数据的查询Products
表
中的数据来自Orders
表
。在组合这些表时,我们将创建一个只包含所需列的新表格结果。 - 沙盒
Products
表
中显示查询结果,而不是Brown女士的原始表。 - 通过验证Brown女士能看到的数据来确认我们的沙盒。
创建仅由管理员访问的集合
我们要创建一个集合存储将用于沙盒此表的SQL查询。就这么说吧沙盒问题
并设置此集合的权限,以便只有管理员可以管理其问题。这样,非管理员就无法修改问题和更改沙盒的“维度”,例如通过包含Brown女士不应该看到的列。看到了吗集合权限了解有关设置权限的详细信息。
创建SQL查询
在顶部栏中,单击+新的>SQL查询到询问SQL问题。选择示例数据库包括在元数据库中。
下面是要粘贴到编辑器中的查询:
SELECT DISTINCT PRODUCTS.TITLE,
PRODUCTS.CATEGORY,
PRODUCTS.PRICE
FROM PRODUCTS
LEFT JOIN ORDERS ON ORDERS.PRODUCT_ID=PRODUCTS.ID
[[WHERE ORDERS.USER_ID IN ({{sandbox}})]]
查询的作用如下:
- 返回包含来自的列的结果
Products
表
格:Title,Category,
和 Price
. - 检查产品是否不同,即每个产品只有一行。
- 可选过滤器此列表仅显示沙盒用户订购的产品。
双方括号[[…]]
周围WHERE
子句使子句成为可选的。双大括号{{sandbox}}
定义变量。我们用这个{{sandbox}}
在沙盒中处理此问题时变量。
让我们运行查询,结果如下:
现在我们把这个问题另存为订单中的产品
,存储在沙盒问题
我们创建的集合,并选择不将问题添加到仪表板.
这里需要重申一点:我们只从Products
表
,因为我们的查询应该只返回要沙盒的表中的列。
使用我们保存的问题对Products表进行沙盒处理
现在我们已经创建了订单中的产品
问题,是时候把Products
表
。我们将设置沙盒,以便元数据库插入user_id
我们在关于行权限进入{{sandbox}}
我们保存的SQL问题中的变量,订单中的产品
.
我们点击齿轮图标,选择管理员设置,然后单击权限标签。在左边,下面数据库,我们将单击示例数据库
和Products
因为Brown女士是客户组的成员,而且是元数据库的成员向组授予数据权限,而不是个人,我们将授予客户沙盒访问Products
表
。
当Metabase弹出沙盒模式,在“您希望如何筛选此表以供此组使用?”节中,我们将选择第二个过滤器选项:“使用保存的问题创建此表的自定义视图。”
我们将只导航到管理员沙盒问题
收集并选择我们的问题,订单中的产品
.为参数或变量
,我们将选择SQL查询中包含的变量,{{sandbox}}
.为了用户属性
,我们将选择user_id
.
我们的总结是:
- 客户群中的人员
- 可以查看
订单中的产品
问题 - 在哪里
沙盒
变量的值等于user_id
让我们点击保存在模态中,然后单击保存更改在公告栏里。
以沙盒用户身份检查设置
让我们看看我们的沙盒Products
从Brown女士的角度看,这张桌子很像。打开一个私人浏览器窗口,导航到我们的元数据库,然后以Brown女士的身份登录。
当我们打开Products
使用数据浏览器,我们可以确认,Brown女士只能看到她订购的产品的列表,并且只有我们保存的三列订单中的产品
问题:Title,Category,
和 Price
.
如果Brown女士问的问题Products
表
,她仍然只能看到基于她订购的产品的结果。如果她可以访问包含沙盒外部列的问题,她将看到一个错误。
在对表进行沙盒处理时,更喜欢使用SQL问题
当我们可以使用GUI问题为了沙盒化一个表,我们建议改用SQL问题。在后台,自定义问题基于过滤器,摘要,和加入在我们的定制问题中。当我们基于一个定制问题进行沙盒测试时,我们可能没有意识到我们提供给人们访问的信息的全部范围。
或者,我们可以使用查询编辑器创建一个自定义问题,然后在引擎盖下查看SQL代码元数据库将运行。在笔记本编辑器中,我们可以单击查看SQL按钮,以确认元数据库包含正确的表和列,而不包含其他内容。
扼要重述
当用沙盒回答问题时:
- 更喜欢SQL查询.
- 确保保存的问题只返回要沙盒的表中的列。
- 将沙盒问题保存在非管理员无法访问的集合中,最好是专门用于沙盒问题的集合。
Metabase中文社区