diff --git a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrMobileController.java b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrMobileController.java index 034cab95..8b3819e4 100644 --- a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrMobileController.java +++ b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrMobileController.java @@ -158,6 +158,16 @@ public class AihrMobileController { response.sendError(HttpServletResponse.SC_FORBIDDEN, "无权访问该录音"); return; } + if (UserType.SYS_USER.getUserType().equals(loginUser.getUserType()) + && !StpUtil.hasRoleOr(TenantConstants.SUPER_ADMIN_ROLE_KEY, "hr_operator")) { + response.sendError(HttpServletResponse.SC_FORBIDDEN, "无权访问该录音"); + return; + } + if (!UserType.APP_USER.getUserType().equals(loginUser.getUserType()) + && !UserType.SYS_USER.getUserType().equals(loginUser.getUserType())) { + response.sendError(HttpServletResponse.SC_FORBIDDEN, "无权访问该录音"); + return; + } ossService.download(ossId, response); } diff --git a/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrPracticeSeedServiceTest.java b/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrPracticeSeedServiceTest.java index a374c483..8a8a8949 100644 --- a/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrPracticeSeedServiceTest.java +++ b/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/service/AihrPracticeSeedServiceTest.java @@ -421,6 +421,7 @@ public class AihrPracticeSeedServiceTest { assertTrue(controllerSource.contains("private static boolean supervisorRoleRequested(String role)")); assertTrue(controllerSource.contains("UserType.SYS_USER.getUserType().equals(loginUser.getUserType())")); assertTrue(controllerSource.contains("StpUtil.hasRoleOr(TenantConstants.SUPER_ADMIN_ROLE_KEY, \"hr_operator\")")); + assertTrue(controllerSource.contains("response.sendError(HttpServletResponse.SC_FORBIDDEN, \"无权访问该录音\")")); assertFalse(controllerSource.contains("private static String supervisorScopeExtPartyId()")); assertFalse(controllerSource.contains("supervisor H5 keeps team-scope")); } diff --git a/docs/BRD_IMPLEMENTATION_AUDIT.md b/docs/BRD_IMPLEMENTATION_AUDIT.md index 932828bf..3003f3fd 100644 --- a/docs/BRD_IMPLEMENTATION_AUDIT.md +++ b/docs/BRD_IMPLEMENTATION_AUDIT.md @@ -173,3 +173,4 @@ - 2026-07-14 发布差异复核:本地最新提交 `2f36476e` 已包含主管多项目范围修复,但 `release-preflight.sh` 因两份既有未提交 Figma 文档阻断;生产根站和 `/h5/` 均返回 `200`,生产管理端仍加载旧资源 `index-CJZ3Ax3Z.js`。本轮未执行生产写入、静态资源同步或服务重启,不能把本地权限修复视为线上已生效。 - 2026-07-14 BRD 4.4 每日三题口径复核:当前 `ensureDailyDrills` 以“移动端训练记录少于 3 次”作为新员工近似条件;`aihr_org_snapshot` 只有快照日期,没有入职/任职起始日期,因此不能证明“入职 3 个月内”,也不能用账号创建时间替代。当前保留该近似仅用于 Demo;正式试点需由组织同步提供并确认 `hire_date/entry_date` 字段后,再把每日派题资格改为真实任职日期判断。 - 2026-07-14 BRD G3 移动首页权限复核:发现公开首页方法对已登录 SYS 用户仍可能调用全局统计分支;现要求只有 APP 用户且身份非空才读取员工/主管动态数据,后台系统用户和异常身份统一返回无业务统计的公开 seed。AIHR 全量测试 `70/70` 通过,未修改生产环境。 +- 2026-07-14 BRD G3 音频读取权限复核:发现移动端音频下载接口对已登录 SYS 用户未校验角色,普通后台账号理论上可枚举 `ossId` 读取训练录音;现复用 `superadmin/hr_operator` 门禁,APP 用户继续按本人/主管项目范围校验,其他身份返回 403。AIHR 全量测试 `70/70` 通过,未修改生产环境。 diff --git a/scripts/demo-check.sh b/scripts/demo-check.sh index 6b5bfdc7..4c9d98fa 100755 --- a/scripts/demo-check.sh +++ b/scripts/demo-check.sh @@ -337,6 +337,7 @@ contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrMobileController.java "return R.ok(mobileSeedService.publicHome(role))" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrMobileController.java "mobileSeedService.home(role, identity)" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrMobileController.java "!UserType.APP_USER.getUserType().equals(loginUser.getUserType())" +contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrMobileController.java "无权访问该录音" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrMobileController.java "supervisorRoleRequested" contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java "public MobileTeamMetrics mobileTeamMetrics(String supervisorExtPartyId)" contains mobile-uni/src/services/practice.ts "/api/train/practice/start"