mysql后台权限设计采用rbac模型,通过users、roles、permissions等五张表解耦控制;菜单按“资源+操作”绑定permission_code;需额外实现数据级权限与操作留痕审计。

设计 MySQL 后台系统的操作权限菜单,核心是把“谁能在哪类数据上做什么”这件事理清楚、落得实。不是堆功能,而是靠数据表结构 + 逻辑控制 + 前端联动,让权限真正可配、可查、可审计。
权限模型选 RBAC,别手写 if-else
用基于角色的访问控制(RBAC)是行业共识。它把用户、角色、权限、资源四者解耦,避免硬编码权限判断。MySQL 后台系统里,典型表结构包括:
- users:存用户基本信息(id、username、status)
- roles:存角色(admin、editor、viewer、audit)
- permissions:存细粒度操作权限(如 ‘user:read’、’order:delete’、’log:export’)
- role_permissions:中间表,关联角色与权限
- user_roles:关联用户与角色(支持多角色)
不建议把权限字段直接加到 users 表里——改个权限就得改表结构或写一堆 case;也不建议每个接口都手动查用户有没有某权限——重复逻辑多、易漏、难审计。
菜单结构按“资源+操作”两级设计
后台左侧菜单不是纯导航,而是权限的可视化出口。菜单项应对应真实可操作的资源节点,比如:
- 用户管理 → 展开后有「列表」「新增」「编辑」「禁用」四个子项
- 订单查询 → 子项为「列表」「导出」「详情」
- 系统日志 → 子项为「查看」「清空」(后者需更高权限)
每个子项背后绑定一个 permission_code,如 ‘user:update’、’order:export’。前端渲染菜单时,只展示当前用户角色已授权的菜单项;后端接口也必须校验同一 permission_code,防止绕过前端直接调用。
MySQL 数据权限要单独处理(行级/列级)
功能权限(能进哪个页面)只是基础。MySQL 后台常涉及敏感数据隔离,比如:
- 不同分公司只能看自己库里的 user 表
- 客服只能查手机号,不能看身份证号
- 财务能看到金额,运营只能看脱敏后的订单号
这类控制无法靠 role_permissions 解决,需额外设计:
- 在 roles 或 user_profiles 表中加字段如 data_scope_type(all / dept / custom)、allowed_databases、allowed_tables
- 查询前动态拼接 WHERE 条件,例如:WHERE tenant_id = ? 或 select id, name, phone FROM user —— 不查 id_card 字段
- 用视图(VIEW)封装常用脱敏查询,权限控制落到视图上
权限变更要留痕,且支持快速回滚
后台权限一旦配错,可能引发越权或锁死。所以每次角色授权、用户加角色、权限删除,都必须记日志:
- 记录操作人、目标角色/用户、变更的 permission_ids、操作时间、IP
- 提供「权限变更历史」页面,支持按时间、人员、角色筛选
- 关键操作(如给 viewer 角色加上 ‘config:write’)触发短信/钉钉告警
- 保留最近 7 天的权限快照,支持一键还原到某时刻状态
不复杂但容易忽略。