核心目标: 解决“谁能看什么数据”的问题,而不仅仅是“谁能用什么功能”。
举个例子:
一家大型连锁超市。
- 功能权限: 决定店员小张能用收银系统(收银功能)、能看到后台库存(库存查询功能)、能下采购订单(采购功能)。
- 数据权限: 决定小张在“库存查询”功能里,只能看到他所在的门店的库存数据;在“下采购订单”功能里,只能给他负责的食品区域下订单。
核心概念解析:
-
功能权限:
- 是什么? 控制你能在系统里做什么操作/看到哪些功能菜单。比如能不能点开“销售订单”菜单,能不能按“删除”按钮。
- 怎么实现? 通常用经典的“用户-角色-菜单”模型(RBAC)。给角色分配菜单权限,用户属于某个角色,就拥有了那个角色的菜单权限。简单说就是:角色决定你能看到哪些“功能按钮”。
- 局限性: 它只控制了你能不能进这个功能,但不控制你进去后能看到哪些具体的数据。
-
数据权限:
- 是什么? 控制你在某个功能里,能看到、操作哪些具体的数据行。比如小张在“销售订单”功能里,只能看到他自己负责的“华东区”的订单。
- 怎么实现? 本质是给数据库查询语句动态加上过滤条件。例如,当小张查询订单时,系统自动变成:
SELECT * FROM orders WHERE region = '华东'
。 - 关键:数据范围: 这就是用户实际能访问的数据子集。范围由多个控权维度决定。
- 控权维度: 就是根据什么标准来划分数据范围。常见的维度有:
- 地理维度: 区域、城市、门店(小张只能看华东区的店)。
- 组织维度: 部门、销售团队(小张只能看自己团队的业绩)。
- 产品维度: 产品线、品类(小张只能负责食品采购)。
- 客户/供应商维度: 特定客户、特定供应商(小张只能处理A客户的订单)。
- 流程维度: 业务线、项目(小张只能参与项目X的数据)。
四种数据权限方案解析:
方案一:基于角色-菜单绑定的权限控制 (角色爆炸方案)
- 思路: 把数据权限的维度值直接绑定到角色上。
- 操作: 创建一个叫“合肥城市经理”的角色,这个角色拥有“销售订单”菜单权限,并且绑定了“合肥”这个区域维度值。再创建一个“阜阳城市经理”角色,拥有同样的菜单权限但绑定“阜阳”。
- 优点:
- 简单直观,控制精确(每个角色权限完全独立)。
- 菜单可以灵活绑定不同维度。
- 致命缺点:角色爆炸!
- 有300个城市,就要建300个“XX城市经理”角色!
- 给所有城市经理加一个新功能菜单?需要修改300个角色!维护极其麻烦,容易出错。
- 总结: 适合权限维度单一、维度值极少的情况。现实中,维度值(如城市、部门、产品线)往往很多,此方案不实用。
方案二:基于用户-角色-范围的权限控制 (一刀切方案)
- 思路: 把数据权限的范围直接绑定在用户上(或者用户关联的角色上,但最终效果类似绑定用户)。
- 操作: 用户张三拥有“销售经理”角色。张三本人被设置了数据范围:
region = '华东'
。那么张三使用任何功能(销售、采购、库存等)时,都只能看到华东的数据。 - 优点:
- 解决了方案一的角色爆炸问题,角色数量大大减少(只需要一个“销售经理”角色)。
- 管理相对简单。
- 致命缺点:维度单一,一刀切!
- 所有功能模块被迫使用同一个数据维度(比如区域)。但不同功能可能需要不同维度!比如:
- 销售订单看区域(华东)。
- 采购订单看产品品类(食品)。
- 供应商管理看供应商类型(一级)。
- 在这个方案下,你只能选一个维度(比如区域)绑给张三,导致他在采购订单里也只能按区域过滤,看不到他负责的食品品类在其他区域的数据!业务需求无法满足。
- 所有功能模块被迫使用同一个数据维度(比如区域)。但不同功能可能需要不同维度!比如:
- 总结: 适合业务非常单一,所有功能模块都适用同一个数据维度的场景。现实中,业务模块对数据维度的要求通常是多维的,此方案灵活性不足。
方案三:菜单绑定控权维度,用户绑定数据权限 (权限放大方案)
- 思路: 菜单决定用哪个维度来过滤数据,用户拥有该维度下的具体值。
- 操作:
- 菜单绑定维度: “销售订单”菜单绑定
区域
维度,“采购订单”菜单绑定产品线
维度。 - 用户绑定权限值: 用户张三被授予
区域
维度的值:合肥
,阜阳
;以及产品线
维度的值:食品
,日化
。 - 权限应用: 张三看“销售订单”时,系统用
区域
维度过滤,显示合肥
和阜阳
的订单。张三看“采购订单”时,系统用产品线
维度过滤,显示食品
和日化
的订单。
- 菜单绑定维度: “销售订单”菜单绑定
- 优点:
- 解决了方案一角色爆炸和方案二维度单一的问题。
- 菜单可以灵活选择不同维度。
- 致命缺点:权限放大!
- 张三在
区域
维度拥有合肥
和阜阳
。这意味着:- 需求:他在“销售订单”里只能看
合肥
,在“采购订单”里只能看阜阳
。 - 现实:因为用户维度值是全局的,他在“销售订单”里会看到合肥+阜阳的数据!同样,在“采购订单”里会看到食品+日化的数据!
- 需求:他在“销售订单”里只能看
- 原因: 用户绑定的维度值(
合肥
,阜阳
)是整个维度的权限,系统无法知道在特定菜单下,只想给他合肥
还是阜阳
。用户在一个维度下的所有值会应用到所有绑定该维度的菜单上。
- 张三在
- 总结: 适合对数据权限要求比较宽松,允许用户看到其维度下所有值的场景。 比如部门主管可以查看本部门所有员工数据,不必区分具体功能。但对于需要精细控制到具体菜单+具体维度值的场景(如张三在A菜单只能看X城市,在B菜单只能看Y产品),此方案无能为力。
方案四:菜单绑定授权维度,角色实例绑定数据权限 (精细控制方案 - 推荐)
- 思路: 菜单决定用哪个维度来过滤数据。角色(注意是具体的角色实例)绑定该角色下该菜单对应的维度具体值。用户的权限是其所有角色的功能权限并集 + 访问不同菜单时动态应用该菜单所属角色实例绑定的数据权限值。
- 操作(结合例子):
- 角色定义:
- 角色A:
城市经理
(功能:导购报量、销售订单、采购订单) - 角色B:
渠道经理
(功能:导购报量、行业订单)
- 角色A:
- 菜单绑定维度: “销售订单”、“采购订单”绑定
区域
维度;“行业订单”绑定渠道
维度;“导购报量”绑定区域
维度(或可能需要其他维度)。 - 角色实例化 & 绑定数据权限:
- 给小张分配角色A (
城市经理
),并指定该角色实例的数据范围:区域 = 合肥
。 - 给小张分配角色B (
渠道经理
),并指定该角色实例的数据范围:渠道 = 阜阳
。
- 给小张分配角色A (
- 用户权限应用:
- 功能权限: 小张拥有
城市经理
(导购报量、销售订单、采购订单) +渠道经理
(导购报量、行业订单) = 所有5个功能的权限。 - 数据权限 (动态切换):
- 小张访问销售订单(属于
城市经理
角色):系统应用城市经理
实例的区域=合肥
过滤,只看到合肥的数据。 - 小张访问行业订单(属于
渠道经理
角色):系统应用渠道经理
实例的渠道=阜阳
过滤,只看到阜阳的数据。 - 小张访问导购报量(两个角色都有此功能):系统取两个角色实例数据权限的并集,即
区域=合肥
OR渠道=阜阳
的数据(具体并集规则可定义)。
- 小张访问销售订单(属于
- 功能权限: 小张拥有
- 角色定义:
- 优点:
- 精细控制: 实现了菜单(功能)-角色实例-数据权限值的精确绑定。
- 解决爆炸: 角色定义是抽象的(
城市经理
),只有给具体用户分配时才绑定数据值,角色数量不会随维度值增长而爆炸。 - 解决放大: 数据权限值绑定在具体的角色实例上,并且系统会根据用户当前访问的菜单自动切换到该菜单所属的角色实例对应的数据权限值,避免了方案三的权限放大问题。
- 支持多角色: 用户拥有多个角色时,功能权限是并集,数据权限能按菜单智能切换。
- 关键点:
- 需要明确菜单与角色的归属关系(一个菜单可能属于多个角色)。
- 需要制定多角色共有菜单的数据权限合并规则(取并集、交集、优先级?常用并集)。
- 总结: 这是目前最灵活、精细的数据权限控制方案,能够满足复杂业务场景下多维度的精细化数据管控需求。 它结合了前几种方案的优点,避免了主要缺点。
小结:
- 功能权限管能不能进某个功能(菜单/按钮)。
- 数据权限管进了功能后能看到哪些具体数据行(通过动态SQL过滤)。
- 方案一 (角色-菜单绑定): 简单精确但角色爆炸,难维护。❌
- 方案二 (用户-范围绑定): 管理简单但所有功能一刀切用同一维度,不灵活。❌
- 方案三 (菜单定维+用户定值): 灵活但用户维度值全局应用导致权限放大。⚠️ (适合宽松场景)
- 方案四 (菜单定维+角色实例定值): 推荐方案! 通过角色实例绑定数据值 + 按菜单智能切换,实现精细控制、避免爆炸、避免放大、支持多角色。✅
- 功能权限: 决定你能进哪些房间(销售部办公室、采购部仓库)。
- 数据权限: 决定你在房间里能看哪些文件柜和文件夹里的文件(在销售部只能看华东区文件柜里的A项目文件夹)。
- 方案一: 每个房间配一个专属管理员(角色),管得很死但管理员太多。
- 方案二: 给你(用户)一串万能钥匙,但所有房间的文件柜只能按一种方式开(比如都按区域开)。
- 方案三: 房间(菜单)告诉你开锁方式(维度),你(用户)有一串钥匙(值),但这串钥匙能开这个方式下所有的锁(你在销售部能用区域钥匙打开所有区域的柜子,即使只想让你看华东)。
- 方案四: 房间(菜单)告诉你开锁方式(维度)。公司给你(用户)分配了不同的工作证(角色实例:如“华东销售专员”、“食品采购员”)。进不同房间时,你出示对应的工作证(角色实例),系统根据工作证上写明的权限(数据值),只让你打开指定的文件柜(在销售部用“华东专员”证只开华东柜,在采购部用“食品采购”证只开食品柜)。最灵活安全!