- 修复RouteService中错误过滤home路由的问题 - 后端现在正确返回所有用户有权限的路由 - 添加设备管理相关功能(列表、在线监控、电源管理、远程监控) - 添加详细的修复文档和重启脚本 - 更新权限配置脚本 问题根源:后端代码中有逻辑会过滤掉home路由,导致前端收到空数组,无法生成菜单 解决方案:移除过滤home路由的逻辑,让后端返回所有有权限的路由
5.6 KiB
5.6 KiB
403权限问题修复说明
问题原因
用户登录后跳转到403无权限页面,主要原因有:
- 缺少 home 路由权限:所有角色的 menus 字段都没有包含
home,导致登录后无法访问首页 - 路由名称格式不一致:
- R_USER 角色配置的是
my_device(下划线) - 但实际路由名称是
my-device(连字符) - 导致权限匹配失败
- R_USER 角色配置的是
- 前端路由守卫检查 roles:
- 后端返回的路由 meta 中包含 roles 字段
- 前端路由守卫会检查用户是否有对应的 roles
- 但在动态路由模式下,后端已经根据用户角色过滤了路由
- 前端不应该再次检查 roles,否则会导致403错误
路由命名规则
- 父路由:使用连字符(kebab-case),如
user-manage、my-device、my-application - 子路由:使用下划线,如
user-manage_list、my-device_status、my-application_apply
修复步骤
1. 运行数据库修复脚本
fix_403_complete.bat
或者手动执行SQL:
mysql -u root -proot < fix_403_complete.sql
这个脚本会:
- 为所有角色添加
home路由权限 - 修正路由名称格式(父路由用连字符,子路由用下划线)
- 确保角色的 menus 字段与数据库中的路由名称一致
2. 重启后端服务
修复数据库后,必须重启 Spring Boot后端服务:
cd backend
mvn spring-boot:run
或者在IDE中重启应用。
重要:后端代码已经修改,会自动移除路由 meta 中的 roles 字段,避免前端重复检查权限。
3. 清除浏览器缓存并重新登录
- 按 Ctrl+Shift+Delete 清除浏览器缓存
- 或者使用无痕模式/隐私模式
- 退出登录
- 重新登录测试
修复后的角色权限配置
R_SUPER(超级管理员)
拥有所有菜单权限:
- home(首页)
- device(设备管理)及所有子菜单
- screen(屏幕监控)及所有子菜单
- user-manage(用户管理)及所有子菜单
- application(使用申请)及所有子菜单
- system(系统设置)及所有子菜单
- my-device(我的设备)及所有子菜单
- my-application(设备申请)及所有子菜单
R_ADMIN(管理员)
除系统设置外的所有管理功能:
- home(首页)
- device(设备管理)及所有子菜单
- screen(屏幕监控)及所有子菜单
- user-manage(用户管理):列表和角色管理(不包括权限管理)
- application(使用申请)及所有子菜单
R_USER(普通用户)
只能访问自己的设备和申请:
- home(首页)
- my-device(我的设备)及所有子菜单
- my-application(设备申请)及所有子菜单
R_STU(学生)
只能访问首页:
- home(首页)
验证修复
1. 检查数据库
-- 查看角色配置
SELECT role_code, role_name, menus FROM sys_role;
-- 查看路由配置
SELECT name, path, component FROM sys_route WHERE status = 1 ORDER BY order_num;
2. 测试登录
使用不同角色的账号登录测试:
- admin/admin123(R_SUPER + R_ADMIN):应该能看到所有菜单
- user/user123(R_USER):应该只能看到首页、我的设备、设备申请
3. 查看后端日志
登录后查看后端控制台输出,应该能看到类似以下的调试信息:
=== 用户路由权限调试 ===
用户ID: 1
用户角色: R_SUPER,R_ADMIN
查询到的角色数量: 2
角色: R_SUPER - 超级管理员
配置的菜单: home,device,device_list,...
允许访问的菜单: [home, device, device_list, ...]
常见问题
Q1: 修复后还是403?
A: 请确保:
- 已重启后端服务
- 已清除浏览器缓存
- 已重新登录
- 检查后端日志确认菜单配置已更新
Q2: 某些菜单看不到?
A: 检查:
- 该菜单是否在角色的 menus 字段中
- 路由名称是否正确(父路由用连字符,子路由用下划线)
- 路由表中是否存在该路由且 status=1
Q3: 如何添加新菜单权限?
A:
- 在 sys_route 表中添加新路由
- 在 sys_role 表的 menus 字段中添加对应的路由名称
- 重启后端服务
技术细节
后端权限过滤逻辑
RouteService.getUserRoutes() 方法:
- 根据用户ID查询用户信息
- 获取用户的角色列表(roles字段)
- 查询这些角色的菜单配置(menus字段)
- 合并所有角色的菜单权限
- 自动添加父菜单(如果配置了子菜单)
- 从路由表中过滤出用户有权限的路由
- 移除路由 meta 中的 roles 字段(避免前端重复检查)
- 构建路由树并返回
前端路由处理
前端使用动态路由模式(VITE_AUTH_ROUTE_MODE=dynamic):
- 登录成功后调用
/route/getUserRoutes获取用户路由 - 前端根据返回的路由动态生成菜单
- 前端路由守卫检查逻辑:
- 检查路由的
meta.roles字段 - 如果路由有 roles 且用户没有对应角色,跳转403
- 在动态路由模式下,后端已过滤路由,meta 中不应包含 roles
- 检查路由的
- 如果访问未授权的路由,会跳转到403页面
修复的关键点
后端修改(RouteService.java):
// 移除 roles 字段,因为后端已经根据角色过滤了路由
// 前端不需要再次检查 roles
meta.remove("roles");
这样前端路由守卫就不会检查 roles,避免403错误。
相关文件
backend/src/main/java/com/soybean/admin/service/RouteService.java- 路由权限过滤逻辑backend/src/main/java/com/soybean/admin/entity/Role.java- 角色实体backend/src/main/resources/sql/init.sql- 数据库初始化脚本fix_403_complete.sql- 权限修复脚本