Skip to content

权限体系

youlai-admin 的权限系统采用三层架构:动态路由(页面级)→ 角色 RBAC(功能级)→ 数据权限(数据级)。

权限模型

┌─────────────────────────────────────────────────────────────┐
│                      用户(User)                             │
│                           │                                  │
│                           ▼                                  │
│                      角色(Role)                             │
│                           │                                  │
│              ┌────────────┴────────────┐                    │
│              ▼                         ▼                    │
│          菜单(Menu)             权限(Permission)          │
│              │                         │                    │
│              ▼                         ▼                    │
│         页面路由                   按钮/操作权限               │
└─────────────────────────────────────────────────────────────┘

三层权限

1. 动态路由权限

用户登录后,根据角色获取可访问的菜单,动态生成路由。

typescript
// 路由守卫中生成动态路由
const dynamicRoutes = await permissionStore.generateRoutes()
dynamicRoutes.forEach(route => router.addRoute(route))

2. 按钮/功能权限

通过权限标识控制按钮显隐:

vue
<!-- 指令方式 -->
<el-button v-hasPerm="['sys:user:add']">新增</el-button>

<!-- 函数方式 -->
<script setup>
if (hasPerm(['sys:user:add'])) {
  // 有权限
}
</script>

3. 数据权限

控制用户能访问的数据范围:

数据范围说明
全部数据可见所有数据
本部门数据仅可见本部门
本部门及以下可见本部门及子部门
仅本人数据仅可见自己创建的

权限标识规范

模块:资源:操作

示例:
sys:user:list    用户列表
sys:user:add     新增用户
sys:user:edit    编辑用户
sys:user:delete  删除用户
sys:user:export  导出用户

后端实现差异

后端权限框架数据权限
JavaSpring Security✅ MyBatis-Plus 拦截
NestJSJWT Guard❌ 需自行实现
GoCasbin❌ 需自行实现

源码位置

模块前端路径
路由守卫src/router/guards/permission.ts
权限 Storesrc/store/modules/permission.ts
权限指令src/directives/permission/
权限函数src/utils/auth.ts

下一步

基于 MIT 许可发布 · 由 ❤️ 和 ☕ 驱动 · 支持作者