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.权限管理
- 管理列表:只返回当前账户所拥有的权限列表,具体的算法为:用户->角色(roleIds)->角色权限关联表->权限列表,超级管理员除外
- 新增功能:只开放给超级管理员(研发),因为只有他们知道怎么配置菜单,尤其是path字段
- 编辑功能:只开发给系统管理员,负责 开启 / 隐藏 部分功能
- 删除功能:只开放给超级管理员(研发),且被删的节点存在子节点时,不允许删除
10.用户管理
- 管理列表:只返回自己和下属的用户列表,超级管理员除外
当前用户 -> 查询自身roleIds -> 查询子角色roleIds -> 合并roleIds -> 通过 用户-角色 关联表进行筛选 -> 返回用户列表
11.角色管理
- 管理列表:只返回自身角色和下属角色列表,超级管理员除外
当前用户 -> 查询自身roleIds -> 查询子角色roleIds -> 合并roleIds -> 返回用户列表
- 角色权限:角色所在列可以查看和设置该角色的权限(树形结构),逻辑难点,因为要根据当前账号和选中的节点角色返回权限范围
- 人员角色批量配置:在当前角色所在列中,展示已经绑定的关联关系和设定关联关系
13.公司管理
- 管理列表:只返回拥有权限的公司列表,超级管理员除外(做分页控制),过滤条件在前端完成(方便进行颜色标注)
- 全部列表:只返回拥有权限的公司列表,超级管理员除外(不做分页,用于右上角公司切换)
当前用户 -> 查询自身roleIds -> 通过 用户-数据角色 关联表进行筛选 -> 返回公司列表