cool-admin(midway版)数据权限架构:权限模型设计与实现终极指南
cool-admin(midway版)作为一款基于Midway.js 3.x构建的现代化后台权限管理框架,其数据权限架构设计巧妙且功能强大。本文将深入解析cool-admin的权限模型设计与实现,帮助开发者理解如何构建安全可靠的企业级权限管理系统。😊
🔐 权限模型核心设计理念
cool-admin采用经典的RBAC(基于角色的访问控制)模型,并在此基础上进行了创新性扩展,形成了四级权限控制体系:
- 用户-角色关联:用户通过角色获得权限
- 角色-菜单关联:角色拥有菜单访问权限
- 角色-部门关联:角色拥有数据范围权限
- 权限标识校验:细粒度接口权限控制
📊 核心实体关系图
用户(User) ──多对多── 角色(Role) ──多对多── 菜单(Menu)
│
└──多对多── 部门(Department)
🏗️ 数据权限架构实现详解
1. 角色实体设计
在 src/modules/base/entity/sys/role.ts 中,角色实体定义了权限控制的核心字段:
@Entity('base_sys_role')
export class BaseSysRoleEntity extends BaseEntity {
@Column({ comment: '数据权限是否关联上下级', default: false })
relevance: boolean; // 数据权限控制关键字段
@Column({ comment: '菜单权限', type: 'json', transformer: transformerJson })
menuIdList: number[]; // 菜单权限列表
@Column({ comment: '部门权限', type: 'json', transformer: transformerJson })
departmentIdList: number[]; // 数据范围权限列表
}
2. 权限校验中间件
src/modules/base/middleware/authority.ts 实现了完整的权限校验逻辑:
- Token验证:JWT令牌解析与校验
- 权限缓存:用户权限信息缓存机制
- URL匹配:动态权限标识匹配
- 超管特权:admin用户拥有所有权限
3. 数据范围权限控制
cool-admin通过部门权限实现数据隔离,在 src/modules/base/service/sys/department.ts 中:
async getByRoleIds(roleIds: number[], isAdmin) {
if (!_.isEmpty(roleIds)) {
if (isAdmin) {
// 超管拥有所有部门权限
const result = await this.baseSysDepartmentEntity.find();
return result.map(e => e.id);
}
// 普通角色根据角色-部门关联表获取权限
const result = await this.baseSysRoleDepartmentEntity
.createQueryBuilder('a')
.where('a.roleId in (:...roleIds)', { roleIds })
.getMany();
return _.uniq(result.map(e => e.departmentId));
}
return [];
}
🚀 权限模型的核心特性
1. 动态权限刷新机制
当角色权限变更时,系统会自动刷新所有相关用户的权限缓存:
// src/modules/base/service/sys/perms.ts
async refreshPerms(userId) {
await this.midwayCache.del(`admin:token:${userId}`);
const roleIds = await this.baseSysRoleService.getByUser(userId);
const perms = await this.baseSysMenuService.getPerms(roleIds);
await this.midwayCache.set(`admin:perms:${userId}`, perms);
// 更新部门权限
const departments = await this.baseSysDepartmentService.getByRoleIds(
roleIds,
await this.isAdmin(roleIds)
);
await this.midwayCache.set(`admin:department:${userId}`, departments);
}
2. 菜单权限粒度控制
系统支持菜单级权限控制,每个菜单可以定义多个权限标识:
// src/modules/base/service/sys/menu.ts
async getPerms(roleIds) {
let perms = [];
if (!_.isEmpty(roleIds)) {
const find = await this.baseSysMenuEntity.createQueryBuilder('a');
if (!roleIds.includes(1)) { // 非超管角色需要权限过滤
find.innerJoinAndSelect(
BaseSysRoleMenuEntity,
'b',
'a.id = b.menuId AND b.roleId in (:...roleIds)',
{ roleIds }
);
}
find.where('a.perms is not NULL');
const result = await find.getMany();
// 提取权限标识并去重
result.forEach(d => {
if (d.perms) {
perms = perms.concat(d.perms.split(','));
}
});
}
return _.uniq(perms);
}
3. 数据权限关联上下级
角色可以设置 relevance 字段控制数据权限是否关联上下级部门,实现灵活的数据隔离策略。
📈 权限架构的优势特点
✅ 模块化设计
权限管理作为独立模块,代码结构清晰,便于维护和扩展。
✅ 缓存优化
权限信息采用缓存机制,减少数据库查询压力,提升系统性能。
✅ 灵活配置
支持动态权限分配,菜单、数据范围均可灵活配置。
✅ 安全可靠
完善的Token验证机制和权限校验流程,确保系统安全。
✅ 易于扩展
权限模型设计合理,便于集成第三方认证和授权系统。
🛠️ 实际应用场景
场景一:多租户数据隔离
通过部门权限控制,不同部门用户只能访问本部门数据,实现数据安全隔离。
场景二:分级管理
上级部门可以查看下级部门数据,下级部门无法查看上级数据。
场景三:功能权限控制
通过菜单权限控制,实现不同角色拥有不同的功能访问权限。
🔧 最佳实践建议
- 合理规划角色体系:根据业务需求设计角色层级
- 精细化权限分配:避免过度授权,遵循最小权限原则
- 定期权限审计:定期检查权限分配情况,确保安全合规
- 缓存策略优化:根据业务特点调整权限缓存时间
🎯 总结
cool-admin(midway版)的数据权限架构通过巧妙的RBAC扩展模型,实现了灵活、安全、高效的权限管理。其四级权限控制体系、动态权限刷新机制和细粒度权限控制能力,为构建企业级后台管理系统提供了坚实的技术基础。
无论是中小型项目还是大型企业应用,cool-admin的权限架构都能满足复杂的权限管理需求,是开发者构建安全可靠后台系统的理想选择。✨
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



