隐藏菜单不等于保护数据。B端权限要同时处理对象、动作、数据范围、字段、状态和时效,并让用户知道自己为什么能看、为什么不能做。
隐藏菜单不等于保护数据。B端权限要同时处理对象、动作、数据范围、字段、状态和时效,并让用户知道自己为什么能看、为什么不能做。
01 先分清两件事:能做什么,能看哪些数据
很多系统把权限配置成一张菜单勾选表:勾选“客户管理”,用户就能进入页面;取消勾选,菜单消失。这样解决的是功能入口,不是数据边界。只隐藏菜单,接口仍可能返回不该看的客户;允许查看客户,也不代表可以导出、转交或删除。
成熟的权限模型通常至少回答四个问题:谁,在什么条件下,可以对哪一类对象,执行什么动作。角色只是其中一个输入,部门、项目成员关系、数据归属、敏感等级和临时授权同样会改变结果。
02 功能权限与数据权限不要塞进一个开关
| 权限层 | 回答的问题 | 例子 |
|---|---|---|
| 页面/模块 | 能否进入这个业务区域? | 能否进入合同管理 |
| 动作 | 进入后可以做什么? | 查看、新建、编辑、作废、导出、审批 |
| 数据范围 | 动作可以作用于哪些记录? | 本人、部门、下属部门、全部、自定义范围 |
| 字段 | 一条记录中哪些信息可见或可改? | 可见客户名称,但手机号脱敏;可看金额,不能改折扣 |
| 条件 | 在什么状态或环境下允许? | 只有草稿可编辑;超过10万元需二次审批 |
| 时效 | 授权何时开始、何时失效? | 项目外包成员只在合同期内查看资料 |
配置界面也应按这些层次组织。先选角色或用户,再选业务对象与动作,最后设置数据范围与例外。把几十个“查看本人客户、编辑本人客户、查看部门客户……”平铺成几百个复选框,短期开发简单,长期几乎无法维护。

03 “本人、部门、全部”背后都有边界问题
本人:按创建人、负责人还是参与人?
一条客户记录可能由A创建,交给B负责,C作为协作人参与。如果“本人数据”没有定义,权限结果会随着开发人员理解变化。建议按对象分别定义归属关系,而不是全系统共用一个owner字段。
部门:只含当前部门,还是包含下级组织?
组织架构会调整,员工也会调岗。需要确认部门范围是动态继承,还是按授权时快照固定;跨部门项目、矩阵汇报和虚拟团队是否参与计算;上级能否自动看到下级全部数据。
全部:是真的全部,还是租户内全部?
多租户SaaS中,“全部数据”通常只能指当前企业租户内全部,不能跨客户组织。平台运营人员的跨租户访问应使用独立的内部权限、审批与审计,不应复用普通企业管理员角色。
自定义范围:不要只给一串组织树
复杂业务常需要“华东区全部客户 + 全国重点客户 - 某敏感项目”。这时单纯勾部门不够,应允许按组织、项目、标签、业务线或数据属性组合规则,同时展示规则命中的样例数量,避免管理员保存了自己也看不懂的条件。
04 角色是起点,不应该成为唯一答案
RBAC适合表达稳定职责,例如销售、财务、审核员;当权限取决于数据属性和上下文时,需要加入属性或关系判断。比如“合同负责人可以编辑自己负责且处于草稿状态的合同”“项目成员只能查看其参与项目的文件”。
| 规则类型 | 适合表达 | 示例 |
|---|---|---|
| 角色规则 | 职责相对稳定、动作集合清晰 | 财务可以查看发票并执行核销 |
| 属性规则 | 由数据、用户或环境属性决定 | 仅允许查看所属区域与客户等级匹配的数据 |
| 关系规则 | 由成员、负责人、上下级或协作关系决定 | 项目成员可查看项目文件,项目负责人可编辑 |
| 条件规则 | 由状态、金额、时间、设备等条件决定 | 草稿可修改;已生效合同只能发起变更 |
| 临时授权 | 代班、外部协作、紧急处理 | 授权48小时,到期自动失效并通知审批人 |

05 权限界面要告诉用户“为什么不可以”
有些能力应隐藏,有些应保留但禁用。判断标准不是视觉整洁,而是用户是否知道这项能力存在,以及是否有合法路径获得它。
- 对完全无关的模块,可以隐藏入口,减少噪声。
- 对用户知道存在、但当前状态不允许的动作,应显示禁用并解释条件,例如“合同已生效,不能直接删除”。
- 对需要申请的权限,提供“申请访问”或联系人,而不是只显示403。
- 列表数量、统计卡片、搜索建议也要按同一权限范围计算,避免用汇总数字泄露数据。
- 导出、批量操作、复制链接和API访问需要单独评估,它们往往比页面查看风险更高。
权限错误最危险的不是按钮多了一个,而是不同入口使用了不同规则:列表看不到,搜索却能搜到;页面字段脱敏,导出文件却是明文。
06 用权限矩阵把规则变成可评审的资产
| 角色/关系 | 查看 | 新建 | 编辑 | 删除/作废 | 导出 | 数据范围 |
|---|---|---|---|---|---|---|
| 销售本人 | 是 | 是 | 草稿/跟进中 | 否 | 需审批 | 本人负责 |
| 销售主管 | 是 | 是 | 条件允许 | 作废需审批 | 是 | 本部门及下级 |
| 财务 | 合同摘要 | 否 | 仅财务字段 | 否 | 是 | 已生效合同 |
| 项目成员 | 是 | 否 | 协作字段 | 否 | 否 | 参与项目 |
| 系统管理员 | 配置可见 | 否 | 不默认改业务数据 | 否 | 审计后 | 租户内 |
矩阵不是最终代码,却能帮助产品、业务、安全和开发讨论同一件事。每一格若出现“视情况而定”,就要继续写出状态、金额、归属或审批条件。

07 必须测试的权限场景
- 同一用户同时拥有两个角色时,权限是取并集、交集,还是显式拒绝优先。
- 员工调岗、离职、组织合并后,历史数据与正在处理的任务如何转移。
- 通过URL、搜索、消息通知、最近访问和导出能否绕过列表权限。
- 用户拥有查看权限但没有字段权限时,接口是否仍返回敏感原值。
- 批量操作中混有无权限记录时,是全部失败、跳过还是提示选择。
- 临时授权到期、审批撤回、账号冻结后,缓存和已打开页面是否及时失效。
- 管理员查看或代操作敏感数据时,是否记录原因、时间和影响对象。
08 权限设计常见疑问
菜单隐藏了,还需要后端校验吗?
必须需要。前端隐藏只能改善界面,用户仍可能通过接口、历史链接或其他入口请求数据。授权判断应在服务端执行,并覆盖每一次请求。
角色越多,权限是不是越精确?
不一定。角色爆炸通常意味着把数据范围、状态条件和临时关系都硬编码成角色。先分离动作与范围,再决定哪些稳定组合值得做成角色。
超级管理员是否应该拥有全部业务数据权限?
不建议默认拥有。系统配置能力与业务数据访问应分开。确需排障或代处理时,可以使用受控的临时访问、二次确认和完整审计。
权限变更需要立即生效吗?
高风险权限撤销应尽快生效,包括令牌、缓存和已打开会话。普通权限增加可以稍有延迟,但界面应提示生效状态,避免管理员以为保存成功而实际仍未同步。
09 让权限成为可解释的业务规则
权限模型不是开发末期的一张配置表,而是业务边界、组织关系和风险控制的共同表达。先把对象、动作、范围、条件和时效写清,再设计角色和界面,系统才能在组织变化后继续维护。