很多企业做数据权限管理,最开始都是从用户和角色入手:给销售开销售报表权限,给财务开财务分析权限,给管理层开放经营驾驶舱。
但随着数据应用越来越多,新的问题很快就会出现。
同一个销售部门,不同区域的员工只能查看各自负责的客户;同一张经营报表,区域经理只能看本区域收入,总经理却需要查看全部区域;财务人员可以查看完整金额,普通业务人员则不应该接触客户身份证号等敏感信息。
这时候,单纯依靠菜单权限和角色划分,就很难满足实际需求。
一套完整的数据权限体系,至少要回答四个问题:谁可以访问、可以执行什么操作、可以访问哪些数据、可以看到哪些字段。
一、先搞清楚:数据权限到底管什么?
设计权限体系之前,需要先把不同层次的权限拆开。很多权限项目越做越复杂,问题往往不是规则不够多,而是把不同类型的权限混在了一起。
第一层:功能权限
解决用户能不能进入某个功能、执行某项操作的问题。例如,销售人员可以查看报表,但没有权限修改数据集;数据开发人员可以编辑加工任务,但不能随意调整系统管理员的授权配置。
第二层:资源权限
解决用户可以访问哪些具体资源的问题。例如,两个用户都有报表查看功能,但一个只能查看销售分析报表,另一个还可以查看库存、财务报表。
第三层:行级权限
解决用户能够看到哪些记录的问题。例如,同一张订单表中,华东区域经理只能查看华东区域的订单,总部管理人员则可以查看全部区域。
第四层:列级权限
解决用户能够查看哪些字段的问题。例如,员工可以查看客户姓名和订单金额,但手机号只能部分展示,身份证号则不能直接查看。
这四层并不能互相替代。拥有报表查看权限,不代表用户可以查看全部数据;只能查看部分记录,也不代表记录中的敏感字段可以全部展示。
落到数据平台建设中,还需要区分谁能操作数据链路、谁能管理数据资源,以及谁能消费最终的数据结果。
例如,FineDataLink 5.0 提供面向用户、部门和角色的权限管理能力,可对数据连接、定时任务、实时任务、接口服务、数据服务应用等资源进行相应的使用、管理和授权控制。对于需要多人协作的数据团队,这有助于明确开发、运维和数据服务管理的职责边界。不过,平台资源权限不等于业务数据的行列级权限,后者仍需结合具体的数据访问链路设计。
二、RBAC 和 ABAC 有什么区别?一个管角色,一个看属性
RBAC 和 ABAC 解决的是授权判断问题,而行级权限和列级权限解决的是数据访问范围问题。它们并不属于同一个维度,可以组合使用。
RBAC:根据角色分配权限
RBAC,即基于角色的访问控制,核心逻辑是:用户 → 角色 → 权限。
例如,企业设置销售、财务、部门经理和系统管理员等角色,再为每种角色分配相应权限。新员工入职后,只要加入销售角色,就能获得对应的功能权限,无须逐项配置。
这种方式结构清晰、管理成本相对较低,特别适合岗位职责比较稳定的企业。
但业务规则一旦变得复杂,角色数量就容易膨胀。假设销售部门有华东、华南、华北三个区域,每个区域又分普通销售、销售主管和区域经理。如果每种组合都建立一个独立角色,权限维护很快就会变得繁琐。
ABAC:根据属性和规则判断权限
ABAC,即基于属性的访问控制,会综合用户、资源、操作和环境等属性判断是否授权。例如:
- 用户属性:所属部门、所在区域、岗位、职级。
- 资源属性:数据所属区域、敏感等级、业务类型。
- 操作属性:查询、修改、导出、删除。
- 环境属性:访问时间、设备状态、网络环境等。
企业可以制定这样的规则:当用户所属区域与订单所属区域一致时,允许查看订单;当用户具备特定管理职责时,可以查看多个区域的数据;当访问涉及高敏感信息时,需要满足额外的授权条件。
RBAC 和 ABAC 的区别,可以简单理解为:RBAC 根据"你是谁、担任什么角色"分配权限,ABAC 则根据"你是谁、数据是什么、要做什么、在什么环境下"综合判断。
实际落地时,不必在两者之间二选一。更常见的思路是:用 RBAC 确定基础权限,再用 ABAC 细化访问条件。
例如,销售角色获得订单查询权限,再通过区域属性限制其数据范围。这样既保留了角色管理的便利性,又避免为每一种业务组合创建独立角色。
三、行级权限怎么设计?关键是限制记录范围
行级权限的核心,是让不同用户查询同一份数据时,只能获取自己有权访问的记录。
以订单表为例:如果张三只负责华东区域,那么系统查询订单时,就应该自动附加相应的数据范围条件。示意逻辑如下:
```sql
SELECT *
FROM orders
WHERE region_id IN (
-- 当前用户获准访问的区域
);
```
这里的区域范围应该根据可信的用户身份、组织关系和授权规则计算得出,不能简单相信前端传入的区域参数。
真正落地时,有三个问题尤其重要。
第一,数据范围从哪里来?
常见依据包括所属部门、负责区域、客户归属、项目成员关系和租户标识等。
例如,区域经理可以查看本区域全部订单,普通销售只能查看本人负责的客户订单。两种规则的判断条件不同,需要提前明确适用范围和优先级。
第二,权限在哪里执行?
如果系统只在前端隐藏不属于当前用户的记录,却没有在后端查询时限制数据,那么用户仍可能通过接口、导出功能或其他查询入口获取越权数据。
因此,行级权限应在可信的服务端或数据访问层执行,并覆盖查询、统计、导出和接口调用等路径。
第三,关联查询和聚合计算怎么办?
假设用户只能查看华东订单,但系统计算销售总额时使用了全部区域的数据,那么即使明细被过滤,汇总结果仍可能泄露其他区域的信息。
如果企业需要将订单数据开放给其他业务系统,可以通过 FineDataLink 5.0 的数据服务能力开发和发布数据 API,并结合鉴权、黑白名单等机制管理调用。需要注意,接口鉴权主要解决调用方能否访问服务的问题;接口内部仍需根据可信身份和授权规则限制记录范围,不能把"能够调用 API"等同于"有权查看全部数据"。
四、列级权限怎么设计?敏感字段不能只靠隐藏
行级权限决定用户能看哪些记录,列级权限则决定用户能看哪些字段。
例如,一张客户信息表包含客户姓名、手机号、身份证号、所属区域、合同金额等字段,不同岗位的实际需求并不相同。销售人员需要客户联系方式,财务人员可能需要合同金额和结算状态,普通业务分析人员则可能只需要客户数量和区域分布。
如果所有用户都能访问整张表,即使已经实现行级权限,敏感字段依然可能暴露。
列级权限通常有三种处理方式。
第一,禁止访问
对于没有业务必要的字段,例如普通分析人员不需要查看的身份证号,可以直接禁止查询或返回该字段。
第二,脱敏展示
例如,手机号显示为 138****1234,身份证号只保留必要的部分信息。
但要注意,脱敏展示不等于访问权限已经得到完整控制。如果原始字段仍能通过其他接口、导出任务或查询语句获取,风险依然存在。
第三,按需提供不同的数据视图
对于使用场景差异明显的业务,可以建立面向不同岗位的数据视图或数据集,只暴露完成工作所需的字段。
在数据服务建设中,这种思路同样适用。FineDataLink 5.0 可以将加工后的数据封装为 API,供其他业务系统按需调用。设计接口时,应根据业务用途明确返回字段,避免直接暴露整张底层表;涉及敏感信息的字段,还应在查询逻辑、服务端或下游应用中落实必要的访问限制与脱敏规则。
这里有一个容易被忽略的细节:字段没有显示出来,不代表字段没有被访问。 例如,前端虽然不展示身份证号,但后端接口仍返回了完整字段,用户就可能通过浏览器开发工具或接口响应获取原始信息。
因此,列级权限不能只做页面上的隐藏操作,而应尽可能在可信的数据查询或服务端执行层落实。
五、行级权限和列级权限,应该怎样组合?
真实业务中,用户往往同时受到角色、数据范围和敏感字段的限制。
例如,一名区域销售经理拥有订单查询权限,只能查看自己负责区域的订单,同时不能查看客户身份证号。系统至少需要依次判断:
- 用户是否具备订单查询功能权限?
- 用户是否有权访问对应的数据资源?
- 当前订单是否属于其获准访问的范围?
- 返回结果中,哪些字段可以展示,哪些需要脱敏或禁止访问?
- 用户是否拥有导出权限,导出内容是否执行同样的限制?
这意味着权限系统不能只维护一张简单的用户—角色对应表,还需要明确不同规则之间的关系。
第一,采用最小权限原则
默认只授予完成工作所必需的权限。新增用户、开放新接口或增加字段时,不应自动获得超出职责范围的访问能力。
第二,明确授权冲突的处理规则
例如,用户通过角色获得查询权限,但某项敏感字段被明确禁止访问,就需要按照预先定义的规则判断最终结果。对于敏感数据,可以采用明确的拒绝优先策略,并谨慎处理角色继承、个人授权和组织授权之间的冲突。
还要特别注意:不同系统对多角色权限的合并方式可能不同,有的采用权限并集,有的支持更细致的策略判断,不能默认所有系统都采用同一套逻辑。
第三,区分平台操作权限与业务数据权限
例如,数据开发人员可以编辑加工任务,并不意味着他有权查看所有业务数据;业务分析人员可以调用数据服务,也不意味着他可以管理数据连接或修改任务配置。
FineDataLink 5.0 的资源权限管理可以帮助团队划分数据连接、任务和接口服务等资源的使用与管理职责;与此同时,企业还需要在具体的数据查询、接口调用和业务应用中落实行列级授权。两层规则分别解决"谁能操作数据资源"和"谁能获取哪些业务数据",不能相互替代。
第四,统一权限判断入口
同一份数据可能通过报表、API、导出任务和分析工具被访问。如果每个入口都单独编写一套规则,时间久了就容易出现权限不一致。
因此,应尽量统一用户身份、权限策略和数据范围的计算逻辑,并对不同访问入口开展一致性测试。
六、数据权限体系落地,建议按照这六步推进
如果企业准备从零建设,或者整改已有权限体系,可以按照以下顺序推进。
第一步:盘点数据资产
梳理核心数据库、业务表、数据集、报表、API 及其使用部门,明确哪些数据涉及客户隐私、财务信息或其他敏感内容。
第二步:建立数据分类分级机制
为数据标注业务归属、敏感等级、责任部门和使用范围。没有统一的数据分类标准,后续权限规则很难保持一致。
第三步:梳理角色和组织关系
先建立常规岗位角色,再明确部门、区域、项目和租户等属性。稳定的岗位职责使用 RBAC,动态的数据范围则可引入 ABAC 规则。
第四步:制定行列级授权策略
明确每类用户能访问哪些记录、哪些字段需要隐藏或脱敏,以及查询、导出、修改等操作分别需要什么权限。
第五步:把权限放到真实的数据链路中验证
检查数据从源系统进入平台、经过加工、形成数据集,再通过报表或 API 被消费的全过程。
例如,当某个经营指标出现异常时,除了检查权限配置,还需要确认数据是否缺失、加工任务是否异常,以及上游数据变化影响了哪些下游应用。FineDataLink 5.0 提供数据质量巡检与数据血缘能力,可以帮助团队发现数据缺失、重复等质量问题,并追溯相关上游表和加工任务,为排查数据链路异常提供依据。不过,血缘和质量检查不能代替权限审计,越权访问仍需通过授权记录、访问日志和实际测试来验证。
第六步:建立持续审计机制
员工离职、岗位调整、项目结束、数据敏感等级变化,都可能导致原有授权失效。
建议定期检查长期未使用的权限、过期项目权限、个人例外授权和高敏感数据访问记录。对于新增接口、字段和数据集,也应执行权限回归测试,防止业务功能更新后出现新的越权入口。
写在最后
数据权限体系设计,最重要的是把不同层次的问题分清楚。
RBAC 解决基础角色授权,ABAC 支持基于属性和条件的细粒度判断;行级权限控制记录范围,列级权限控制字段访问与展示。
真正成熟的权限体系,不是给每个用户配置越来越多的角色,而是建立一套可解释、可执行、可审计、可持续维护的规则。
谁因为什么身份获得权限,能够访问哪些数据,哪些信息必须受到限制,以及当业务发生变化时权限如何及时调整——这些问题都得到明确回答,数据权限体系才算真正落地。