fix(sysuser): 编辑用户接口误抛「组ID不能为空」
build / build-push (push) Successful in 1m40s

SysUserController.edit 无条件调用 requireGroupInScope(request.getGroupId()),
而该方法对 null 直接抛错;但 service.edit 不读 groupId、DTO 仅在 Create 校验、
前端编辑按契约不提交 groupId,导致每次编辑必崩。改为仅当 groupId 非空时才校验
其落在数据范围内,越权防线仍由 requireUserInScope(id) 承担。mvn test 102 全绿。
This commit is contained in:
chenxing
2026-09-11 09:58:58 +08:00
parent 5cec25736a
commit d6e995a954
@@ -66,10 +66,15 @@ public class SysUserController {
@OperationLog("编辑用户")
@PostMapping("Edit/{id}")
public void edit(@PathVariable Integer id, @RequestBody @Validated(ValidationGroups.Update.class) SysUserRequest request) {
// 关键防线:目标用户本身必须与数据范围有交集。request.groupId 只是前端上下文,
// 伪造 groupId(范围内任一组)+ 任意 id 可跨校改他人资料/重置密码(账号接管)。
// 关键防线:目标用户本身必须与数据范围有交集。伪造任意 id 可跨校改他人资料/重置密码(账号接管),
// 由 requireUserInScope(id) 拦截——它与 request.groupId 无关,是编辑越权的唯一有效锚点。
accessScopeService.requireUserInScope(id);
accessScopeService.requireGroupInScope(request.getGroupId());
// groupId 对编辑无业务语义(SysUserService.edit 不读取它,仅按 schoolId+roleIds 落身份),
// 且 DTO 与前端契约均声明「groupId 仅 Create 校验、编辑不提交」。故为空时不再拦截(修复「组ID不能为空」);
// 仅当前端确实带了组上下文时,才二次校验该组落在数据范围内,保留防御纵深。
if (request.getGroupId() != null) {
accessScopeService.requireGroupInScope(request.getGroupId());
}
sysUserService.edit(id, request);
}