From ebd72363887a48e9d60fb84383f0a8e187f25473 Mon Sep 17 00:00:00 2001 From: let5sne Date: Tue, 14 Jul 2026 13:10:16 +0800 Subject: [PATCH] fix(aihr): restrict mobile personal data reads --- .../dromara/aihr/controller/AihrMobileController.java | 10 +++++++++- .../aihr/service/AihrPracticeSeedServiceTest.java | 3 +++ docs/BRD_IMPLEMENTATION_AUDIT.md | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) 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 e7cfb468..6221a7d1 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 @@ -215,7 +215,15 @@ public class AihrMobileController { private static String ownMobileExtPartyId(String requested) { String username = currentAppUsername(); - return username.isBlank() ? requested : username; + if (!username.isBlank()) { + return username; + } + LoginUser loginUser = LoginHelper.getLoginUser(); + if (loginUser != null && UserType.SYS_USER.getUserType().equals(loginUser.getUserType()) + && !StpUtil.hasRoleOr(TenantConstants.SUPER_ADMIN_ROLE_KEY, "hr_operator")) { + throw new ServiceException("无权访问员工个人数据"); + } + return requested; } private static String scopedAssignmentExtPartyId(String requested) { 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 25b649a9..086b009b 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 @@ -472,6 +472,9 @@ public class AihrPracticeSeedServiceTest { assertTrue(controllerSource.contains("catch (RuntimeException ex)")); assertTrue(controllerSource.contains("private String supervisorScopeExtPartyId()")); assertTrue(controllerSource.contains("mobileSeedService.requireSupervisorIdentity(currentAppUsername())")); + assertTrue(controllerSource.contains("无权访问员工个人数据")); + 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("@SaCheckLogin\npublic class AihrMobileController")); assertTrue(controllerSource.contains("@SaIgnore\n @GetMapping(\"/home/{role}\")")); assertTrue(controllerSource.contains("if (!LoginHelper.isLogin())")); diff --git a/docs/BRD_IMPLEMENTATION_AUDIT.md b/docs/BRD_IMPLEMENTATION_AUDIT.md index b7db017a..7f99e4d2 100644 --- a/docs/BRD_IMPLEMENTATION_AUDIT.md +++ b/docs/BRD_IMPLEMENTATION_AUDIT.md @@ -256,3 +256,4 @@ - 2026-07-14 发布证据链复核:`release-preflight.sh` 原先只检查构建产物存在和 hash,旧产物可能被误当成当前提交发布;现增加跨 macOS/Linux 的产物时间门禁,管理端、H5 入口/主资源和后端 jar 必须不早于当前 `HEAD`,否则明确要求重建。该修复只收紧本地发布前检查,未修改生产环境。 - 2026-07-14 BRD 发布边界复核:基于当前 `HEAD=0433250b` 重新构建管理端、`mobile-uni` H5 和后端 jar 后,`release-preflight.sh` 的产物新鲜度检查通过;线上根站与 `/h5/` 仍返回 `200`,但线上仍加载管理端 `assets/index-CJZ3Ax3Z.js`、H5 `assets/index-D4-NrEpb.js`,本地当前产物分别为 `assets/index-ClaGy0E5.js`、`assets/index-C5pwI-WO.js`。预检随后因两份用户未提交的 Figma 文档停止;本轮未修改、暂存或提交这两份文档,也未执行生产同步、后端重启或业务数据写入,因此当前 BRD 修复仍未被证明在线上生效。 - 2026-07-14 BRD 4.3.4 门禁补强:严格试点预检不再只按启用场景数量判断覆盖,新增“服务推介/增值”和“日常服务”场景存在性统计;当前仅增加事实检查,不臆造场景内容,场景成功条件、SOP 适用范围和正式质量仍需内容负责人确认。行为测试夹具已覆盖两类统计,严格门禁会在缺任一核心流程时明确失败。 +- 2026-07-14 BRD G3 个人数据边界复核:移动端个人历史、错题、画像、晋升证据和任务读取共用 `ownMobileExtPartyId`;此前普通系统用户可传任意 `extPartyId`,绕过 HR/管理员角色读取员工个人数据。现统一要求系统用户具备 `superadmin` 或 `hr_operator`,APP 用户仍只使用登录手机号,主管团队接口继续走独立项目范围校验;补源码回归断言,未改变数据库或生产数据。