1. 整体架构
- 采用RBAC模型,用户登录后,后端基于角色返回权限数据
- 权限数据包含两部分:可访问的菜单列表 + 页面按钮的操作权限
注:RBAC(Role-Based Access Control,基于角色的访问控制)是业界最广泛使用的权限管理模型。核心思想是:权限不直接授予用户,而是通过“角色”作为中间层。
2. 菜单权限实现
- 后端返回结构化的菜单数据(包含路径、标题、图标等)
- 前端动态生成路由表和侧边栏菜单
3. 按钮权限实现
- 后端返回类似这样的数据结构:
childResource:[{ id:'', pageName: '数据概览', pageType: '', pageURI: '/manage/overview', childResource: [ { id:'', pageName: '新增', pageType: '3' }, { id:'', pageName: '编辑', pageType: '3' }, { id:'', pageName: '查询', pageType: '3' } ] }] - 前端通过自定义指令(如
v-permission)或组件方式控制按钮显隐 - 页面加载时,从当前路由获取页面标识,匹配对应的权限数组
4. 权限拦截
- 路由守卫中做权限校验,防止直接输入URL越权访问
- 如果用户尝试无权限的页面,跳转到403或提示无权限”
扩展
-
权限缓存:将权限数据存入Vuex/Pinia和localStorage,避免每次刷新重新请求
-
动态路由:根据权限动态添加路由,而不是一次性挂载所有路由
-
安全性考虑:前后端双重校验,前端控制UI展示,后端真正拦截请求
-
性能优化:权限判断逻辑抽离成工具函数,避免重复计算