Skip to main content

行级权限

场景

行级权限通过维护每个用户的「标识」,实现各用户对同一个字段的行级访问权限。下面以「区域」标识为例:

  • 账号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」标识。

image-20230914152058271

对权限标识的核心操作是建立「用户-权限值」的关系,在上述场景中,A用户可查询北京、上海,B用户可查询北京,则需建立如下关系:

A: bj,sh
B: bj

注意这里建立的是用户与表中的字段值的关系。

点击「关联用户」按钮,进入「用户-权限值」绑定页面,在此页面可查看当前已绑定的用户信息。点击「新增用户行级权限」,可设置某个用户的权限值。

  • 在左侧面板中,选择某个用户。
  • 在右侧面板输入当前用户的权限值,也可以在左侧面板中选择某张表的某个字段,系统自动将此字段值过滤出来,勾选后可快速添加至右侧面板。
  • 某个用户有多个权限值时,须用英文逗号隔开,不支持其他分隔符。
  • 权限值需与字段的值完全匹配才能生效。

image-20230914152243694

对于多层结构的数据源,所对应的表选项会在jdbc或zoom集群连接时,这是在行级权限中无法选中生成API中所对应的表的原因之一,给到对应的范围权限.表范围权限生成API>=行级权限 例如trino数据源会在连接的时候根据zoom集群根据链接信息确定hive表和scheme表的权限 image-20230906140146422

设置API行级权限

在新建/编辑API的「参数配置」步骤中,可选择一个或多个入参作为行级权限,勾选「行级权限」后,需选择一个行级权限标识。

image-20230914151818241

行级权限测试与生效

行级权限功能支持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地区数据,返回空集,不会有错误提示。

行级权限效果