Files
railwaysystem/docs/codebase-audit/15_live_permission_snapshot.md
T
wangzhibiao fb00f67d3b docs(审计): 完成Phase 0工程与数据库基线核验
记录当前Git开发基线、Kingbase真实表结构、培训数据与权限状态。

补充数据库与代码差异、只读兼容性验证及PRD V1.0核心对象映射,未包含业务代码或数据库修改。
2026-09-14 00:36:53 +08:00

6.2 KiB

Phase 0:培训菜单与权限实时快照

数据来自 public.sys_menu、public.sys_role、public.sys_user_role、public.sys_role_menu 的只读统计,不输出用户身份或密码字段。

1. 培训菜单是否真实存在

是。实时 public.sys_menu 中有23条培训相关菜单:6个目录、17个页面菜单。所有记录均为 visible=0、status=0,路径和组件没有重复。

ID 菜单 类型 path component perms
2154 教学设施 目录 equip — 空
2155 教师信息 页面 teacher train/teacher 空
2156 学员信息 页面 student train/student 空
2157 教室信息 页面 classroom train/classroom 空
2158 实训场地 页面 site train/site 空
2159 人员管理 目录 person — 空
2160 设备物联 页面 extra train/extra 空
2161 宿舍信息 页面 dormitory train/dormitory 空
2162 课程管理 目录 coursemgr — 空
2163 课程信息 页面 course train/course 空
2164 开班计划 页面 plan train/plan 空
2165 教学成果 目录 result — 空
2166 成绩信息 页面 score train/score 空
2167 自主学习 目录 self — 空
2168 电子设备 页面 equipment train/equipment 空
2169 统计分析 目录 analysis — 空
2170 开班签到 页面 report train/report 空
2171 课程签到 页面 checkin train/checkin 空
2172 学习时长 页面 duration train/duration 空
2173 学员画像 页面 portrait train/portrait 空
2174 电子班牌 页面 board train/board 空
2175 课程成绩 页面 course-score train/course-score 空
2176 学员成绩 页面 student-score train/student-score 空

17个 component 对应的 Vue文件在 build_ui/src/views/ 中均存在。因此“菜单记录和页面组件存在”成立。

2. 权限字符串真实状态

  • public.sys_menu 总计106行,其中79行具有权限字符串。
  • 23条培训目录/页面中,具有权限字符串的行数为0。
  • 培训区没有按钮类型 F 菜单记录。
  • 实时库未找到 train:*、system:teacher:*、system:student:*、system:course:*、system:plan:*、system:info:*、system:report:*、system:auth:*、system:site:*、system:board:*、system:checkin:*、system:duration:* 或 system:portrait:* 培训权限。

因此数据库虽然能生成菜单路由,却不能向普通角色授予 Controller要求的培训操作权限,也不能满足前端按钮权限指令。

3. 与前端 v-hasPermi 的比较

多数生成页面使用:

train:teacher:*
train:student:*
train:course:*
train:plan:*
train:auth:*
train:info:*
train:site:*
train:report:*
train:board:*
train:checkin:*
train:duration:*
train:portrait:*

实时 sys_menu.perms 没有这些字符串。宿舍与成绩当前页面没有 v-hasPermi按钮控制,但这不等于后端允许访问。

结论:普通用户即使获得页面菜单,生成页面的受控按钮也会因权限集合缺失而隐藏。

4. 与 Controller @PreAuthorize 的比较

后端使用 system:* 前缀:

资源 Controller权限
教师 system:teacher:*
学员 system:student:*
课程 system:course:*
开班计划 system:plan:*
宿舍权限 system:auth:*
场地 system:site:*
报到 system:report:*
班牌 system:board:*
签到 system:checkin:*
学习时长 system:duration:*
画像 system:portrait:*
宿舍、教室、成绩 共用 system:info:*

实时 sys_menu 同样没有这些权限。宿舍、教室、成绩共用 system:info:* 还会造成资源授权过宽;它们无法独立控制。

结论:前端、后端、数据库三方权限字符串没有任何一组形成一致闭环。

5. 角色与关系表真实状态

项目 实际情况
public.sys_user 1个有效应用用户;不输出身份明细
public.sys_role 0行
培训角色 0个
public.sys_user_role 20行;18个用户引用孤儿,20个角色引用全部孤儿
public.sys_role_menu 170行;170个角色引用全部孤儿,9个菜单引用孤儿
public.sys_role_dept 0行

应用用户ID 1存在且有效,若依代码通常对管理员提供通配权限;但当前数据库层还存在下述同名表解析问题,不能据此确认管理员登录路径正常。

6. Kingbase同名系统视图对权限体系的影响

Kingbase的 sys_catalog 提供同名 sys_user、sys_role、sys_config 视图,而实际若依表在 public。当前schema搜索顺序把 sys_catalog 放在 public 前。

使用与 Mapper相同的未限定表名进行只读探测时:

  • sys_user.user_id 报字段不存在。
  • sys_role.role_id 报字段不存在。
  • sys_config.config_id 报字段不存在。

现有 SysUserMapper.xml、SysRoleMapper.xml、SysConfigMapper.xml 都使用未限定表名。这会影响用户加载、角色加载和系统配置查询,是普通角色权限之外的基础运行阻塞项。

7. PRD V1.0菜单对象缺口

实时菜单仍围绕旧14个CRUD和遗留占位页组织,未发现以下PRD V1.0正式业务页面:

  • 本期课程/开班课程
  • 参训学员关系
  • 课次/课程表
  • 床位与住宿安排
  • 独立门禁授权流程
  • 成绩项目与权重
  • 培训班工作台

“开班签到”被放在“统计分析”目录下,也不符合PRD V1.0按培训班流程组织页面的建议。以上只记录现状,不在本轮修改菜单。

8. 最终判断

  1. 培训菜单记录真实存在,component文件也存在。
  2. 当前无法确认用户能正常登录并看到菜单,因为核心若依表存在schema解析冲突。
  3. 普通角色权限当前不能正常工作:应用角色为0、关系表有孤儿、培训perms为空、前后端权限字符串不同。
  4. 没有发现重复培训path/component;主要问题是权限缺失和 system:info:* 过宽。