架构 · 权限审计

业务系统权限和操作日志怎么设计?RBAC、数据权限和审计追踪

企业系统的权限设计不只是菜单显示隐藏,还包括角色权限、数据范围、字段权限、操作日志、审批记录和异常追踪。

只要系统进入真实业务,权限就会变复杂。谁能看客户、谁能改订单、谁能导出数据、谁能审批、谁操作过某条记录,这些都关系到管理效率和风险控制。权限设计如果一开始太随意,后面会很难补。

典型架构链路

  1. 用户 User
  2. 角色 Role
  3. 权限 Permission
  4. 资源 Resource
  5. 数据范围 Data Scope
  6. 操作日志 Audit Log
  7. 审批 / 风控

RBAC:先把用户、角色、权限拆开

用户不应该直接绑定一堆零散权限,而是通过角色获得权限。角色可以是管理员、销售、仓库、财务、项目经理、客户等。

菜单权限不等于操作权限

能看到订单列表,不代表能删除订单;能查看客户,不代表能导出客户。按钮级、接口级权限要和菜单权限分开控制。

数据权限决定能看哪些记录

同样是销售角色,有的人只能看自己的客户,有的人能看本部门,有的人能看全部。数据范围通常需要按本人、部门、门店、项目、客户归属来过滤。

字段权限用于保护敏感信息

手机号、报价、成本、利润、合同附件等字段可能需要脱敏或限制查看。字段权限可以避免低权限角色看到敏感数据。

操作日志要记录关键动作

创建、修改、删除、导出、审批、登录失败、权限变更都应该记录操作人、时间、IP、旧值、新值和业务对象。

审计追踪让系统可复盘

当库存不对、订单异常、客户信息被改时,审计日志能帮助团队快速定位是谁、什么时候、因为什么操作导致变化。

脱敏项目复盘:多部门合同与订单系统的权限设计

权限系统不是给菜单打几个勾。一类合同订单项目同时有销售、交付、财务、区域负责人和外部协作方:销售能看自己的客户,负责人能看区域数据,财务能看金额但不应修改交付,临时接替人员还需要有期限的授权。权限一旦模糊,轻则工作被阻塞,重则发生数据泄露。

业务与产品形态

先按业务动作梳理查看、创建、修改、提交、审批、导出和作废,再定义本人、团队、部门、区域和全局等数据范围。后台提供角色模板、成员授权、临时委托和访问复核;普通用户在任务页只看到自己能处理的记录,不必理解复杂权限配置。

技术解决方案

功能权限使用 RBAC 管理,数据范围通过策略条件附加到查询,敏感字段再做独立掩码与导出控制。服务端对每个业务用例统一鉴权,不能依赖前端隐藏按钮;权限缓存带版本号,组织或授权变化时主动失效。审计日志记录主体、动作、对象、时间、来源、结果及关键字段前后值,并与普通业务日志分开保存。

难点设计

组织调整、跨部门项目、人员离职、临时代理和批量导出最容易出现漏洞。授权必须有生效与失效时间,离职流程主动回收令牌和权限;跨部门访问通过项目成员关系显式授予,不能靠共享账号。审计记录采用追加写入并限制删除,敏感数据只保存必要摘要,避免日志本身成为泄露源。

用户体验

无权限时说明缺少哪类授权和申请入口,不返回模糊的系统错误;审批人能看到权限申请原因、范围和期限。管理员用“某人能看到哪些客户、为什么能看到”反向检查策略,并定期收到长期未使用和即将过期权限清单。

产品效果与验收

测试使用角色与数据范围矩阵,既验证允许路径,也验证越权、横向访问、批量接口和导出。指标包括越权请求拦截、权限申请处理时间、离职回收时效、审计定位时间和季度访问复核完成率。权限系统的目标是在不阻碍正常协作的前提下,使每次敏感访问都能解释、限制和追溯。

权限系统的目标不是隐藏按钮,而是守住业务边界

前端不显示“删除”只能改善体验,真正的权限判断必须发生在每一个后端入口。用户可能直接调用 API,也可能通过导出、批量任务和移动端访问同一份数据。我们会先建立“角色—资源—动作—数据范围”的权限矩阵,再让接口层使用统一授权组件,避免每个开发者用不同条件判断。

RBAC 解决职责,数据范围解决归属

管理员、销售、仓库等角色适合 RBAC,但“销售只能看自己的客户”“区域经理能看本区域”属于属性和关系条件。真实系统经常采用 RBAC 加数据范围:角色决定能否执行动作,组织、归属人、项目成员和记录状态决定能对哪些数据执行。过滤条件必须进入查询语句,不能先查出全部数据再在应用层删除。

权限变化需要处理缓存和存量会话

为了性能,角色和菜单常被缓存,但员工调岗、离职或权限收回时,旧 Token 和缓存可能继续生效。我们会给权限配置增加版本号,重要变更主动使会话失效;高风险操作再次读取实时权限。批量导出、后台任务也要记录发起人的权限上下文,不能由一个拥有超级权限的任务进程无条件执行。

审计日志应不可随业务记录一起修改

审计内容至少包括操作者、时间、请求 ID、业务对象、动作、结果和关键字段前后值。密码、令牌和完整身份证号不能进入日志,联系方式按需要脱敏。审计表与普通业务表分开授权,只追加不覆盖;删除业务记录时仍保留必要的审计引用。对于审批、退款和权限变更,还应记录原因及关联单据。

超级权限也需要边界

生产环境不应存在长期共享的万能账号。紧急处理可以使用临时提权机制,要求申请原因、限定时间并完整审计;危险操作增加二次确认或双人审批。我们还会定期导出角色权限差异,检查长期未使用账号、孤立角色和权限膨胀。权限设计不是一次配置,而是跟组织变化一起维护的系统能力。

权限校验要落在后端的哪几层

身份、角色与权限是三件不同的事

认证层确认当前 principal,授权层再根据 user_role、role_permission 判断能否执行某个 action。后端接口按权限编码校验,不能依赖前端菜单是否显示。角色或员工状态变更后要让会话与权限缓存及时失效,离职账号立即停用;高风险操作可要求近期重新认证,避免长期登录态被借用。

数据范围必须进入查询条件

“可以查看订单”不代表可以查看全部订单。服务端根据租户、组织、负责人和协作关系生成数据范围谓词,并在仓储查询层统一应用。用户传入 customer_id 或 order_id 时仍要验证对象归属,不能只在列表接口做过滤、详情接口直接按主键返回。多租户系统还应在表结构和唯一约束中包含 tenant_id。

字段脱敏与导出要单独授权

销售可能需要客户电话但不能看到成本,财务能看金额却不一定能导出全部客户。序列化响应时按字段策略屏蔽或脱敏,导出、批量下载和复制敏感信息设置独立权限,并限制数量与频率。前端隐藏列只是体验优化,真正的字段控制必须在 API 输出阶段完成。

审计日志不能和普通调试日志混为一谈

审计记录至少包含 operator_id、action、resource_type、resource_id、before、after、request_id、IP 与时间,采用追加写入并限制删除权限。登录失败、权限拒绝、导出、审批和配置修改都应留痕。紧急越权账号要有过期时间和使用原因;日志设置保留周期与访问权限,既能追责,也避免审计库本身成为数据泄漏入口。

落地前建议确认

  • 是否有多个业务角色
  • 是否需要限制数据范围
  • 是否有敏感字段
  • 是否需要追踪修改、删除、导出和审批
需要把架构落到你的业务里?

先描述你的业务场景、现有工具和数据流,我们帮你判断该从哪一层开始做。

快速描述您的需求