权限模型设计基础:从理论到落地

权限模型这东西,说白了就是「谁可以看什么」的一套规则。我刚开始做BI的时候,觉得权限嘛,不就是给个开关,能看不能看就完了?后来被业务部门追着改权限改了三个月,才明白——权限模型设计不好,后面全是坑。

今天咱们就把这块掰开揉碎了讲。核心就四个东西:RBAC模型、用户与组织架构、数据维度与权限标签、继承与覆盖规则。嗯,一个一个来。

1. RBAC:用户-角色-权限模型

RBAC(Role-Based Access Control)是目前最主流的权限模型。它的核心思想很简单:用户不直接关联权限,而是通过角色来间接获得权限。

举个例子你就明白了:

  • 用户「张三」属于「销售经理」这个角色
  • 「销售经理」这个角色拥有「查看华北区销售数据」的权限
  • 那张三自然就能看华北区的数据了

为什么要绕这么一圈?直接给张三授权不行吗?

我在项目中遇到过这种情况:公司有500个销售,如果每个人单独授权,哪天组织架构调整,你得改500次。但如果你只维护「销售经理」「销售主管」「销售代表」这三个角色,改一次角色权限,所有关联用户自动生效。你想想看,这效率差了多少?

RBAC 三要素关系:

  • 用户(User):系统操作的主体,可以是人也可以是服务账号
  • 角色(Role):权限的集合,代表一类职责或岗位
  • 权限(Permission):对某个资源的具体操作能力,比如「查看报表A」「编辑报表B」

这里有个关键点:角色是权限的容器,用户是角色的容器。一个用户可以有多个角色,一个角色也可以有多个用户。这就是多对多的关系。

我的经验:角色命名要规范。别用「角色1」「角色2」这种名字,三个月后你自己都忘了是干嘛的。我一般用「业务域_岗位_级别」的格式,比如「销售_经理_高级」。

2. 用户与组织架构的关联

光有RBAC还不够。现实中的企业是有组织架构的——部门、团队、汇报关系。权限模型必须能映射这种结构。

常见的做法是:把组织架构作为权限分配的依据。比如:

  • 用户属于「华北销售部」
  • 「华北销售部」关联了「华北区销售数据」的权限
  • 那这个用户自动获得华北区数据的查看权限

这样做的好处是:组织架构变了,权限自动跟着变。员工从华北调到华东,权限自动切换,不用人工干预。

我曾经帮一家零售企业做权限设计,他们每个月都有人员调动。如果用传统方式,IT部门得专门安排一个人天天改权限。后来我们改成基于组织架构的权限模型,IT部门直接解放了。

注意:组织架构不是一成不变的。设计时要考虑:

  • 组织架构变更时,权限如何平滑迁移?
  • 临时借调、兼职等情况怎么处理?
  • 离职员工的权限如何自动回收?

3. 数据维度与权限标签设计

行级权限的核心,就是在数据行级别做过滤。那怎么告诉系统「哪些行你能看,哪些不能」?答案就是——权限标签。

权限标签,说白了就是给数据行打上「属性标记」。比如:

数据维度 权限标签示例 说明
区域 region = '华北' 按地理区域划分
部门 dept = '销售部' 按组织归属划分
产品线 product_line = 'A系列' 按业务线划分
数据等级 data_level = '机密' 按安全等级划分

设计权限标签时,我建议遵循几个原则:

  • 标签粒度要适中:太粗了控制不住,太细了维护成本高
  • 标签值要稳定:别今天叫「华北」,明天叫「North China」
  • 标签要有业务含义:别用「A001」「B002」这种代号

举个例子。假设销售数据表里有「区域」字段,值有「华北」「华东」「华南」。那权限标签就是:

-- 用户张三的权限标签
region IN ('华北', '华东')

-- 查询时自动拼接
SELECT * FROM sales_data
WHERE region IN ('华北', '华东')  -- 这行是权限系统自动加的

你看,用户根本感觉不到权限的存在,但数据已经被过滤了。

4. 权限继承与覆盖规则

这是最容易出问题的地方。我见过太多因为继承和覆盖规则没理清楚,导致权限混乱的案例。

权限继承:子节点自动获得父节点的权限。比如:

  • 「销售部」有查看「销售数据」的权限
  • 「销售一部」继承了「销售部」的权限
  • 那「销售一部」的人也能看「销售数据」

权限覆盖:子节点可以修改或拒绝继承来的权限。比如:

  • 「销售部」有查看「销售数据」的权限
  • 但「销售二部」因为业务特殊,被禁止查看「高端产品线」的数据
  • 这就是覆盖——在继承的基础上做了限制

继承与覆盖的核心规则:

  • 默认继承:子节点自动获得父节点的所有权限
  • 显式拒绝优先:如果子节点明确拒绝了某个权限,以拒绝为准
  • 显式授权优先:如果子节点明确授予了某个权限,以授予为准
  • 就近原则:离用户最近的权限定义优先级最高

我曾经遇到过一个坑:某公司给「华东区」授权了查看「华东数据」的权限,但「华东区」下面的「上海团队」又单独授权了查看「全国数据」的权限。结果上海团队的人能看到全国数据,但华东区其他团队看不到。业务部门投诉说「权限不一致」。后来我们加了规则:子节点的权限不能超过父节点的范围,除非显式授权。这才解决了问题。

避坑指南:

  • 继承层级不要太深,超过3层就容易混乱
  • 覆盖规则要文档化,别靠口头传
  • 每次权限变更都要做回归测试,防止覆盖失效

整体架构图

下面这张图把上面讲的四个部分串起来了。你可以看到用户、角色、组织架构、权限标签、继承规则之间的关系。

权限模型核心架构 用户 (User) 角色 (Role) 组织架构 权限标签 继承与覆盖规则 数据行 图例说明: 1. 用户通过「角色」或「组织架构」获得权限标签 2. 权限标签定义了用户能看哪些数据行 3. 继承与覆盖规则决定了权限的传递和冲突处理 4. 最终,数据行根据权限标签进行过滤 5. 核心原则:用户 → 角色/组织 → 标签 → 数据行 6. 覆盖规则:显式拒绝 > 显式授权 > 默认继承

嗯,到这里权限模型的基础就讲完了。这四个部分——RBAC、组织架构、权限标签、继承覆盖——是行级权限的四大支柱。后面咱们讲具体实现的时候,你会发现所有方案都是围绕这四个东西展开的。