行级权限
场景
行级权限通过维护每个用户的「标识」,实现各用户对同一个字段的行级访问权限。下面以「区域」标识为例:
- 账号A:可查询北京、上海地区的数据
- 账号B:可查询北京地区的数据
使用行级权限,需要API访问的原始数据表中存在行级标识的字段,以本场景为例,表信息如下:
- zone_id:区域标识,需根据此标识来区分不同用户的查询权限
- sales_d:每个区域的日销售额
|zone_id|sales_d|
|-------|-------|
|bj |123.12 |
|sh |234.09 |
|hz |52.1 |
行级权限的本质是在用户查询时,系统自动拼接每个用户的where条件语句,以实现行级权限的过滤(row filter)。以本场景为例子,A、B执行的SQL为:
-- 用户A
select zone_id, sales_d from api_row_filter where zone_id in ('bj', 'sh');
-- 用户B
select zone_id, sales_d from api_row_filter where zone_id in ('bj');
权限标识管理
「权限标识」指的是基于哪些信息「字段」作为行级权限,在上述场景中,「区域」即作为一个标识。进入「API管理-授权与安全-行级权限」页面可对权限标识进行管理。对权限标识的基本管理包括新增、 编辑、删除等。同时可在页面查看权限标识与哪些API产生了关联关系。
在上述场景中,需建立「zone」标识。
对权限标识的核心操作是建立「用户-权限值」的关系,在上述场景中,A用户可查询北京、上海,B用户可查询北京,则需建立如下关系:
A: bj,sh
B: bj
注意这里建立的是用户与表中的字段值的关系。
点击「关联用户」按钮,进入「用户-权限值」绑定页面,在此页面可查看当前已绑定的用户信息。点击「新增用户行级权限」,可设置某个用户的权限值。
- 在左侧面板中,选择某个用户。
- 在右侧面板输入当前用户的权限值,也可以在左侧面板中选择某张表的某个字段,系统自动将此字段值过滤出来,勾选后可快速添加至右侧面板。
- 某个用户有多个权限值时,须用英文逗号隔开,不支持其他分隔符。
- 权限值需与字段的值完全匹配才能生效。
对于多层结构的数据源,所对应的表选项会在jdbc或zoom集群连接时,这是在行级权限中无法选中生成API中所对应的表的原因之一,给到对应的范围权限.表范围权限生成API>=行级权限
例如trino数据源会在连接的时候根据zoom集群根据链接信息确定hive表和scheme表的权限
设置API行级权限
在新建/编辑API的「参数配置」步骤中,可选择一个或多个入参作为行级权限,勾选「行级权限」后,需选择一个行级权限标识。
行级权限测试与生效
行级权限功能支持API测试,对API提交后可在「API管理-API管理-API」页面,通过测试URL和token进行测试。
行级权限的生效分为2方面:
- 设置API行级权限,需将API提交、发布后才正式生效,提交后即可进行测试。
- 用户-权限值的绑定,在管理员进行保存后立即生效,建议谨慎修改。
调用效果
在本场景中,A用户可查询bj、sh
(北京、上海)2个权限值,需在API入参中将zone_id
的操作符设置为in
。调用的效果如下:
A用户(bj、sh权限)
"zone_id": "bj"
,正常返回北京地区数据。"zone_id": "bj,sh"
,正常返回北京、上海地区数据。"zone_id": "bj,hz"
,查询「北京、杭州」地区数据,仅返回「北京」地区,且不会有错误提示,如下图所示。"zone_id": "hz"
,无权限查询hz
地区数据,返回空集,不会有错误提示。
B用户(bj权限)
"zone_id": "bj"
,正常返回北京地区数据。"zone_id": "sh"
,无权限查询sh
地区数据,返回空集,不会有错误提示。