SysUserController.edit 无条件调用 requireGroupInScope(request.getGroupId()), 而该方法对 null 直接抛错;但 service.edit 不读 groupId、DTO 仅在 Create 校验、 前端编辑按契约不提交 groupId,导致每次编辑必崩。改为仅当 groupId 非空时才校验 其落在数据范围内,越权防线仍由 requireUserInScope(id) 承担。mvn test 102 全绿。
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user