场景痛点:传统权限管理的局限性
在企业数据应用中,不同角色对数据的访问需求存在显著差异:
- 金融行业:客户经理仅能查看所属片区客户数据,风控专员需跨区域分析风险指标
- 零售行业:区域经理仅能访问管辖门店的销售数据,而总部分析师需全局视角
- 医疗领域:医生仅能调阅本人接诊患者的病历数据,科研团队需脱敏后的聚合数据
在基于数据服务API进行数据查询时,我们通常使用用户信息以及用户的权限配置表进行限制,或者基于应用级别进行授权。但前者无法将用户的权限进行统一的管控,且难以满足API服务与SQL查询的统一管控需求。后者则会让应用的构建变得非常复杂而无法实施。
功能全景:多维权限管控能力
Dataphin数据服务在5.2版本中,新增了行级权限管控能力,可支持多种方式的行级权限管控。
双模式访问机制
直连模式(应用身份鉴权)
- 应用以自身身份调用API,系统校验应用的行级权限规则
- 适用于公共数据看板、系统级报表等场景
代理模式(用户身份透传)
- 通过
DelegationUid参数透传用户身份,动态继承用户行级权限 - 典型场景:SaaS应用代不同租户查询数据、BI工具代理用户执行分析
自动化权限继承体系
- 直连数据源API:自动继承底层表的行级权限配置
- 服务单元API:支持独立配置或继承父级权限,子API自动继承服务单元规则
动态权限决策引擎
在API调用时序中嵌入实时权限决策:
- 身份认证 → 2. 代理模式校验 → 3. 行级权限动态计算 → 4. 列级权限过滤
配置实践
实践场景概述
接下来我们就用一个具体的例子来演示如何利用行级权限来管控API的调用权限。
某全国连锁零售企业拥有华北、华东、华南3大区域,每个区域下辖10个门店。需要满足以下的权限管控需求:
- 区域经理仅能查看本区域门店的销售数据
- 总部分析师可查看所有区域数据
- 通过BI工具(应用系统)调用数据服务API生成动态看板
下图展示的是数据服务及行级权限管控的架构。通过代理模式支持行级权限,使得在应用系统调用数据服务API时,也能使用最终用户的行级权限控制API的返回数据。使用该方式有以下的前提条件:
- Dataphin的用户与应用系统的用户保持一致,或可获取映射关系。通常Dataphin与应用系统都通过SSO与同一个IDP对接,以确保用户管理的统一,或者使用相同的用户体系进行认证和识别。如果不能通过这样的方式保持用户名一致,也只要能有用户的映射表,将应用系统的用户与Dataphin的用户进行对应,通过DelegationUid参数传回即可。
- 通常终端的分析看板用户不会直接登录Dataphin,因此我们一般建议外置一个权限申请系统,通过该系统用户可申请所需的行级权限,通过申请后,用Dataphin提供的OpenAPI的功能给用户授权行级权限。
在本实践场景中,我们假定Dataphin与应用系统已经对接到统一的IDP,并且授权系统也已经开发完成。
- SSO认证流程:
- 所有应用和Dataphin都与IDP进行了SSO集成
- 用户通过SSO单点登录进入应用系统
- 数据访问流程
- 应用使用代理模式访问Dataphin API
- 使用SOURCE_USER_ID作为AccountType,确保正确映射IDP用户
- 权限管理流程
- 用户可以通过授权系统申请新的行级权限
- 管理员审批后,通过OpenAPI更新Dataphin内的行级权限配置
- 用户标识映射
- 应用系统(通过IDP)提供source_user_id (如"east_mgr")
- Dataphin通过source_user_id进行权限控制
步骤1:定义行级权限规则
在Dataphin-管理中心-权限管理-行级权限中创建以下行级权限,并配置好行级权限规则。
注意:若同一张表配置多条行级权限,它们将以“与”的逻辑生效。即用户需满足全部行级权限的约束才能查看某行数据。建议把权限逻辑配置进一条行级权限。例如:
销售区域及门店控制 | 授权用户/用户组 |
所有行 | 总部分析师 |
华东所有门店(region = '华东') | 华东区经理 |
华南所有门店(region = '华南') | 华南区经理 |
华北所有门店(region = '华北') | 华北区经理 |
华东门店1(store_id = 'SH001') | 华东门店1店长 |
华东门店2(store_id = 'SH002') | 华东门店2店长 |
... | ... |
步骤2:配置API,并设置行级权限
接下来,我们创建直连数据源API,ListStoreSales,用于查询门店销售额。
SELECT region, store_id,SUM(sales_amount) AS total_sales FROM sales_data WHERE sales_date BETWEEN ${start_date} AND ${end_date} GROUP BY region,store_id;
Dataphin数据服务根据代码中使用的表sales_data,自动推荐了该表关联的行级权限:销售区域及门店控制。我们保持该行级权限的开启。
步骤3:授权代理权限
Dataphin中已经创建好了应用(分析看板),用于调用Dataphin数据服务API。接下来我们要给应用授予API(ListStoreSales)的以下权限:
- API字段权限:授予应用(分析看板)所有的返回字段的使用权限,也可根据需要减少字段的权限。
- 代理权限:授予应用(分析看板)API的代理权限。有了代理权限后,应用在调用API时,就可以代理用户的行级权限
- 行级权限:无需授权。在这个例子中,由于应用本身不需要提供默认的数据行的权限,仅需代理用户的行级权限,因此无需拥有任何行级权限
由于在步骤一中,我们已经设置了用户的行级权限,因此现在应用可以开始调用API,数据服务将自动对数据的行级范围进行管控。
步骤4:应用调用API
接下来就可以编写应用的代码,调用API(ListStoreSales)获取数据了。在调用代码中,通过设置DelegationUid 和 AccountType设置行级权限的模式为代理模式,并指定代理的用户。在这个例子中,由于我们通过SSO,已经对接了统一的IDP,因此我们可以假设我们可以通过SOURCE_USER_ID(源系统账号ID)来唯一识别和标识用户。
String sourceUserID; // get source user id from context // ... QueryParamRequest queryParamRequest = new QueryParamRequest(); queryParamRequest.setAccountType("SOURCE_USER_ID"); queryParamRequest.setDelegationUid(sourceUserID);
以下是代理模式调用的流程图。可以看到由于设置了DelegationUid,Dataphin数据服务将把本次调用识别为代理行级权限模式调用,因此将从参数中获取到实际的用户,并对该用户进行设置。
不同角色调用同一API时,行级权限的生效效果:
角色 | 系统实际运行的SQL语句 & 查询结果 | |
总部分析师 | 系统自动拼接用户对应的行级权限管控规则,此处是“所有”,无需额外拼接条件
可查看所有门店数据
| |
华东区经理 | 此处自动拼接管控规则“region=华东”
可查看华东区门店数据
| |
华东门店1店长 | 此处自动拼接管控规则“store_id=SH001”
可查看华东门店1数据
| |
Dataphin行级权限的创新优势
Dataphin数据服务行级权限的创新突破:
- 全域统一权限体系
- 实现API服务与SQL查询的权限打通,避免重复授权
- 示例:为"财务部门"角色配置的预算数据权限,同时约束Doris查询和API访问
- 灵活高效的应用集成扩展能力
- 支持应用系统通过代理模式访问数据,既保证了应用开发和运维的便捷性,又能精准控制到终端用户级别的数据访问范围
- 提供可扩展的统一权限控制,支持跨表字段关联到同一权限规则下,大幅降低权限管理复杂度
- 与数据开发全流程深度整合
- 安全能力与数据开发过程紧密结合,确保数据全链路的安全可控
- 权限规则与API版本绑定,确保API的可维护性
- 性能优化创新
- 动态SQL改写技术:将权限规则转化为底层查询的WHERE条件
这种创新的权限管理方案,不仅解决了传统视图授权的繁琐问题,更为企业提供了统一、精细、高效的数据安全管控能力。
结语:重塑企业数据安全范式
Dataphin通过行级权限+代理模式+全域管控的创新组合,为企业构建了"精准、灵活、智能"的数据安全防护网。无论是构建面向客户的API网关,还是打造内部数据中台,均可实现"数据可用不可见,越权访问零容忍"的安全目标,助力企业在合规前提下释放数据要素价值。
立即体验,开启企业级数据安全新纪元!