Jeecgboot 的权限体系核心为按钮权限(功能权限)+ 数据权限,基于 Shiro 实现权限校验,遵循「用户 - 角色 - 权限」的关联逻辑(用户关联角色、角色绑定权限,权限不直接分配给用户),所有权限配置最终通过系统端配置 + 前后端代码注解 / 校验联动生效。
一、前期准备工作:
- 创建学生角色
- 创建学生用户:账号为学生的学号
- 为学生用户分配学生角色
二、数据权限配置(行级数据过滤,学生仅看自己的成绩):
核心实现:系统配置数据规则 + 后端加注解触发过滤,让 Jeecgboot 动态拼接 SQL 的 where 条件,实现 "学生只能查看自己的成绩数据"。
(一)系统端配置(菜单 + 数据规则 + 角色授权)
- 添加下级权限按钮:菜单管理下,成绩管理添加下级(查看学生列表按钮/权限)
- 配置数据规则:给成绩管理添加数据规则:StudentNo 等于 当前登录用户账号
- 学生角色授权:学生角色只能访问成绩管理-查看成绩列表的权限,并保存数据规则
(二)后端代码配置
核心注解:@PermissionData,作用是触发 Jeecgboot 的动态数据权限拦截器,对请求进行数据过滤,仅需加在查询类方法上(列表查询 / 分页查询)。
- 注解位置:在 Controller 层对应「查看学生列表」的方法(如list/queryPage)上添加注解,类上添加则该类所有方法生效;
- 核心参数:pageComponent值必须和菜单管理中「查看学生列表」的「组件路径」完全一致(大小写敏感);
(三)数据权限核心原理
用户访问查看列表接口→@PermissionData注解触发拦截器→根据pageComponent匹配对应菜单→获取该菜单的数据规则→动态拼接 SQL 的 where 条件(StudentNo = 登录用户账号)→拦截 MyBatis 查询操作→执行过滤后的数据库查询→返回仅当前用户可见的数据。
三、按钮权限配置(功能权限,精细化控制增删改等操作)
按钮权限是功能级别的权限校验,核心实现:系统配置按钮权限标识 + 后端注解做接口校验 + 前端判断做界面控制,实现 "管理员可操作增删改,学生无任何操作权限"。
(一)系统端配置(菜单按钮 + 角色授权)
- 添加操作按钮权限:菜单管理-成绩管理添加下级:增删改导入导出按钮权限(访问路径和授权标识)
- 管理员角色授权
(二)后端代码配置:
核心注解:@RequiresPermissions(Shiro 原生注解,Jeecgboot 集成),作用是校验当前登录用户的角色是否拥有该权限标识,无权限则直接返回 403 错误,仅需加在操作类 Controller 方法上。
(三)前端配置(界面控制,按钮显隐)
在 GradeList.vue 中添加权限判断,确保只有拥有相应权限的用户才能看到操作按钮:
导入usePermission函数:import { usePermission } from '/@/hooks/web/usePermission';
添加权限判断变量:const { hasPermission } = usePermission();
函数方式:
- 新增按钮: v-if="hasPermission('school:grade:add')"
- 编辑按钮: v-if="hasPermission('school:grade:edit')"
- 删除按钮: v-if="hasPermission('school:grade:delete')"
四、权限生效完整流程梳理
(一)数据权限生效流程
用户登录→前端访问「查看学生列表」接口→后端 Controller 触发@PermissionData注解→Jeecgboot 权限拦截器根据pageComponent匹配对应菜单→获取菜单的数规则(StudentNo=登录用户账号)→动态拼接 SQL 查询条件→MyBatis 执行过滤查询→返回仅当前用户可见的成绩数据→前端渲染列表。
(二)按钮权限生效流程
用户登录→后端查询该用户角色的所有权限标识→返回并缓存至前端 Store→页面渲染时,hasPermission/v-hasPermi校验权限标识→控制按钮显 / 隐→用户点击按钮→前端调用对应接口→后@RequiresPermissions校验权限标识→校验通过执行方法,校验失败返回 403 错误→前端提示无权限。