1.前言
- 后台管理系统的权限管理一般使用RBAC,它是 Role-Based Access Control 的缩写,中文译为 基于角色的访问控制,是一种广泛使用的权限管理模型
- 它的核心思想是通过“角色”这一中间层,将用户(User)和权限(Permission)解耦,从而实现更灵活、高效的权限分配和管理
- 通过 用户 → 角色 → 权限,用户通过角色间接获得权限
2.RBAC 的核心组成
- 用户(User):系统的具体使用者(如员工、管理员)
- 角色(Role):权限的集合,代表某种职能或身份(如“管理员”“财务”“普通用户”)
- 权限(Permission):对资源或操作的最小控制单元(如“访问菜单A”“删除数据B”)
- 用户-角色关联:多对多关联
- 角色-权限关联:多对多关联
3.RBAC 的核心优势
- 复用性:同一角色可分配给多个用户,避免重复配置权限
- 易维护:修改角色权限时,关联用户自动生效
- 逻辑清晰:角色名称通常反映业务职能(如“财务审核员”),便于理解和管理
4.权限表
- 前端:对于前端而言,权限决定菜单是否展示,页面是否可以访问,按钮是否展示等
- 后端:对于后端而言,权限决定api是否可以访问,访问时能够返回哪些数据
- 唯一索引:path
| 字段 |
说明 |
类型 |
默认值 |
| title |
标题(前端用于菜单展示) |
DataTypes.STRING |
- |
| name |
名称(前端用于路由注册) |
DataTypes.STRING |
- |
| path |
路径(对于前端是页面路径,对于后端是接口地址) |
DataTypes.STRING |
- |
| pid |
父级id |
DataTypes.INTEGER |
0 |
| icon |
图标 |
DataTypes.STRING |
- |
| remarks |
描述 |
DataTypes.TEXT |
- |
| sort |
排序 |
DataTypes.INTEGER |
0 |
| isMenu |
是否展示菜单(用于区分页面还是API) |
DataTypes.INTEGER |
1 |
| isFull |
是否全屏展示 |
DataTypes.INTEGER |
0 |
5.用户表
- 记录用户基本信息,还有各端登录的Token值
- 唯一索引:userName
| 字段 |
说明 |
类型 |
默认值 |
| userName |
用户名 |
DataTypes.STRING |
- |
| nickName |
昵称 |
DataTypes.STRING |
- |
| password |
密码 |
DataTypes.STRING |
- |
| status |
启用状态 |
DataTypes.INTEGER |
1 |
| isAdmin |
是否是超级管理员 |
DataTypes.INTEGER |
0 |
| token |
web登录令牌 |
DataTypes.STRING |
- |
| appToken |
App登录令牌 |
DataTypes.STRING |
- |
| lastLoginTime |
最后登录时间 |
DataTypes.DATE |
- |
6.角色表
| 字段 |
说明 |
类型 |
默认值 |
| roleName |
角色名 |
DataTypes.STRING |
- |
| description |
描述 |
DataTypes.TEXT |
- |
| pid |
父级id |
DataTypes.INTEGER |
0 |
7.用户角色关联表
- 记录 用户-角色 的关联关系,可以做外键,当基础数据被删除时,关联数据自动删除
- 唯一索引:userId + roleId
| 字段 |
说明 |
类型 |
默认值 |
| userId |
用户id(外键->User) |
DataTypes.INTEGER |
- |
| roleId |
角色id(外键->Role) |
DataTypes.INTEGER |
- |
8.角色权限关联表
- 记录 角色-权限 的关联关系,可以做外键,当基础数据被删除时,关联数据自动删除
- 唯一索引:permissionId + roleId
| 字段 |
说明 |
类型 |
默认值 |
| permissionId |
权限id(外键->Permission) |
DataTypes.INTEGER |
- |
| roleId |
角色id(外键->Role) |
DataTypes.INTEGER |
- |
9.权限管理(菜单管理)
- 管理列表:只返回当前账户所拥有的权限列表,超级管理员除外
- 新增功能:只开放给超级管理员(研发),因为只有他们知道怎么配置菜单,尤其是path字段
- 编辑功能:只开发给超级管理员(研发),因为只有他们知道怎么配置菜单
- 删除功能:只开放给超级管理员(研发),因为只有他们知道怎么配置菜单,被删的节点存在子节点时,不允许删除
10.用户管理
- 管理列表:返回所有数据,非超级管理员只返回普通用户,这个功能不做数据筛选,只限制功能开关
用户列表不能根据RBAC权限模型来返回对应的下属用户,因为新用户不属于任何角色,导致除了超级管理员以外的任何账号都无法对他进行管理,导致它永远无法被设置成任何角色
11.角色管理
- 角色分级:超级管理员(开发)管‘能做什么’,系统管理员‘谁能做’(RBAC),业务只管‘去做’”
树的源头由超级管理员开启,接着由他的根(系统管理员)负责开枝散叶
- 管理列表:只返回自身角色和下属角色列表,超级管理员除外,非超级管理员不得创建根节点
当前用户 -> 查询自身roleIds -> 查询子角色roleIds -> 合并roleIds -> 返回用户列表
- 角色权限:角色所在列可以查看和设置该角色的权限(树形结构),逻辑难点,因为要根据当前账号和选中的节点角色返回权限范围
- 人员角色批量配置:在当前角色所在列中,展示已经绑定的关联关系和设定关联关系
13.公司管理
- 管理列表:只返回拥有权限的公司列表,超级管理员除外(做分页控制),过滤条件在前端完成(方便进行颜色标注)
- 全部列表:只返回拥有权限的公司列表,超级管理员除外(不做分页,用于右上角公司切换)
当前用户 -> 查询自身roleIds -> 通过 用户-数据角色 关联表进行筛选 -> 返回公司列表