要实现 Vue 框架结合 Sa-Token 按不同身份(角色/权限)展示不同功能板块,核心是前后端协同:
- 后端:基于 Sa-Token 完成登录认证、角色/权限的校验与管理;
- 前端:通过 Sa-Token 返回的 Token 维持登录状态,结合路由守卫、权限指令控制功能板块的显示/隐藏。
以下是完整的实现方案(涵盖 Vue2/Vue3,以 Vue3 + Pinia 为例,Vue2 仅需替换状态管理为 Vuex 即可)。
一、核心原理
| 端 | 核心职责 |
|---|---|
| 后端 | 1. 登录时生成 Sa-Token,绑定用户角色/权限; 2. 接口层通过 Sa-Token 注解(@SaCheckRole/@SaCheckPermission)校验权限; 3. 提供接口返回当前用户的角色/权限列表。 |
| 前端 Vue | 1. 登录后存储 Token 和用户角色/权限; 2. 路由守卫拦截无权限路由; 3. 自定义指令/工具函数控制页面内功能板块的显示; 4. 请求拦截器携带 Token 完成鉴权。 |
二、后端实现(Spring Boot + Sa-Token)
先完成后端的 Sa-Token 配置和鉴权逻辑,为前端提供支撑。
1. 依赖引入(Maven)
1 |
|
2. Sa-Token 基础配置(application.yml)
1 | sa-token: |
3. 核心业务实现
(1)用户实体与权限枚举
1 | // 角色枚举 |
(2)登录接口(核心)
1 |
|
(3)权限拦截接口(示例)
1 |
|
三、前端 Vue 实现
基于 Vue3 + Pinia + 之前封装的 request.js 实现,核心是状态管理、路由鉴权、组件级权限控制。
1. 环境准备
(1)封装的 request.js 中添加 Token 携带逻辑(已在之前的封装中包含,补充适配 Sa-Token):
1 | // request.js 中的请求拦截器部分 |
(2)创建 Pinia 状态管理(存储 Token 和用户权限):
1 | // src/stores/user.js |
2. 路由鉴权(核心:控制页面级访问)
(1)路由配置(添加 meta 元信息,声明角色/权限要求):
1 | // src/router/index.js |
3. 组件级权限控制(控制功能板块/按钮显示)
通过自定义指令实现细粒度的权限控制(如按钮、功能板块的显示/隐藏)。
(1)创建权限指令:
1 | // src/directives/permission.js |
(2)注册全局指令(main.js):
1 | // src/main.js |
(3)组件中使用(控制功能板块/按钮):
1 |
|
4. 登录/退出逻辑(页面示例)
1 |
|
四、效果演示
| 用户角色 | 可访问页面 | 可操作功能 |
|---|---|---|
| admin | 首页、用户管理、订单管理 | 添加用户、删除用户、查看订单 |
| user | 首页、订单管理 | 仅查看订单 |
| operator | 首页、运营面板 | 仅查看运营数据 |
五、关键注意事项
- Token 持久化:前端需将 Token 存储到
localStorage/sessionStorage,防止页面刷新丢失; - 无感刷新 Token:结合 Sa-Token 的
active-timeout,前端可在 Token 过期前调用StpUtil.renewTimeout()刷新有效期(后端提供刷新接口); - 权限缓存:用户角色/权限可缓存到前端,无需每次请求接口都校验;
- 后端兜底校验:前端权限控制仅为“展示层面”,核心权限校验必须在后端通过
@SaCheckRole/@SaCheckPermission实现,防止前端篡改; - Vue2 适配:将 Pinia 替换为 Vuex,指令注册方式改为
Vue.directive,路由守卫逻辑一致。
六、扩展优化
- 动态路由:若权限配置从后端动态获取,可在登录后通过
router.addRoute动态添加路由,进一步细化权限; - 按钮级别禁用:除了隐藏,还可通过指令禁用按钮(
el.disabled = true),提升用户体验; - 权限缓存刷新:当用户权限变更时,主动刷新前端缓存的权限列表;
- 多标签页适配:通过
localStorage监听,实现多标签页登录状态同步。
通过以上方案,即可完整实现 Vue 框架基于 Sa-Token 的“不同身份展示不同功能板块”,兼顾安全性和易用性。