权限管理系统是多数业务系统必备的功能模块,RBAC(基于角色的访问控制)模型通过角色作为用户和权限的中间层,避免了直接给用户分配权限带来的维护成本过高的问题,是MySQL实现权限管理的首选方案。

RBAC模型核心概念
RBAC模型的核心是将权限与角色绑定,用户通过关联角色获取对应权限,主要包含四个核心要素:
- 用户(User):系统的实际操作主体,比如后台管理员、普通用户等
- 角色(Role):一组权限的集合,比如超级管理员、内容编辑、普通访客等
- 权限(Permission):具体的操作许可,比如新增文章、删除用户、查看报表等
- 会话(Session):用户激活角色后建立的会话,用于获取当前可用的权限集合
MySQL数据库表结构设计
基于RBAC模型的标准规范,我们需要设计5张核心表来实现完整的权限管理逻辑,表结构如下:
1. 用户表(sys_user)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 用户ID,主键自增 |
| username | varchar(50) | 用户名,唯一索引 |
| password | varchar(100) | 加密后的密码 |
| status | tinyint | 用户状态,1正常0禁用 |
| create_time | datetime | 创建时间 |
2. 角色表(sys_role)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 角色ID,主键自增 |
| role_name | varchar(30) | 角色名称,比如超级管理员 |
| role_code | varchar(30) | 角色编码,唯一索引,比如SUPER_ADMIN |
| description | varchar(100) | 角色描述 |
| create_time | datetime | 创建时间 |
3. 权限表(sys_permission)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 权限ID,主键自增 |
| perm_name | varchar(50) | 权限名称,比如新增用户 |
| perm_code | varchar(50) | 权限编码,唯一索引,比如USER_ADD |
| perm_type | tinyint | 权限类型,1菜单2按钮3接口 |
| parent_id | bigint | 父级权限ID,顶级为0 |
| url | varchar(200) | 对应资源地址,比如/api/user/add |
| create_time | datetime | 创建时间 |
4. 用户角色关联表(sys_user_role)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键ID,自增 |
| user_id | bigint | 用户ID,关联sys_user.id |
| role_id | bigint | 角色ID,关联sys_role.id |
| create_time | datetime | 创建时间 |
该表需要建立联合唯一索引,避免同一用户重复关联同一角色,索引语句如下:
-- 创建用户角色关联表联合唯一索引 ALTER TABLE sys_user_role ADD UNIQUE INDEX idx_user_role (user_id, role_id);
5. 角色权限关联表(sys_role_permission)
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键ID,自增 |
| role_id | bigint | 角色ID,关联sys_role.id |
| permission_id | bigint | 权限ID,关联sys_permission.id |
| create_time | datetime | 创建时间 |
同样需要建立联合唯一索引,避免同一角色重复关联同一权限:
-- 创建角色权限关联表联合唯一索引 ALTER TABLE sys_role_permission ADD UNIQUE INDEX idx_role_perm (role_id, permission_id);
基础业务逻辑实现示例
1. 给用户分配角色
给用户分配角色本质是往sys_user_role表插入关联关系,同时需要先清除该用户原有的角色关联,示例SQL如下:
-- 先删除用户原有角色关联 DELETE FROM sys_user_role WHERE user_id = 1; -- 给用户ID为1的用户分配角色ID为2和3的角色 INSERT INTO sys_user_role (user_id, role_id) VALUES (1, 2), (1, 3);
2. 查询用户所有权限
通过用户ID关联用户角色表、角色权限表、权限表,可以查询到用户拥有的所有权限,示例SQL如下:
SELECT DISTINCT p.* FROM sys_user u JOIN sys_user_role ur ON u.id = ur.user_id JOIN sys_role_permission rp ON ur.role_id = rp.role_id JOIN sys_permission p ON rp.permission_id = p.id WHERE u.id = 1 AND u.status = 1;
3. 权限校验逻辑示例(Java伪代码)
在接口请求时校验当前用户是否拥有对应权限,核心逻辑是先获取用户所有权限编码,再判断是否包含当前接口需要的权限编码:
// 获取当前登录用户的ID
Long userId = getCurrentUserId();
// 查询用户所有权限编码
List<String> userPermCodes = permissionDao.queryPermCodesByUserId(userId);
// 当前接口需要的权限编码
String needPermCode = "USER_DELETE";
// 校验是否有权限
if (userPermCodes.contains(needPermCode)) {
// 执行后续业务逻辑
return true;
} else {
// 返回无权限提示
return false;
}
扩展优化建议
如果业务场景需要更细粒度的权限控制,可以在基础RBAC模型上做扩展:
- 增加组织维度:给角色绑定数据范围,比如部门管理员只能管理本部门的数据
- 增加权限继承:子角色可以继承父角色的权限,减少重复配置
- 增加临时角色:支持给用户分配有效期内的临时角色,过期自动失效
以上设计可以满足大部分中小型系统的权限管理需求,表结构清晰且扩展性强,后续业务迭代时调整成本较低。