From 97c54d38b59c5df28660b0d8fee065f8473ddc26 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Fri, 7 Aug 2026 07:00:58 -0600 Subject: [PATCH] =?UTF-8?q?fix(Minor=20M1):=20=E8=A7=92=E8=89=B2=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E6=94=B9=E5=9B=9E=E7=99=BD=E5=90=8D=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit isAdminRole 之前写成 `adminType !== "Regular User"`。当前四种角色下与旧后端等价, 但将来新增任何角色(助教、家长……)都会默认拿到管理员权限,包括 canViewSubmission 里的「看所有人代码」——加角色的人多半想不到要回来改这里。 改成显式列举,对齐 account/models.py:65-73。实测四种已知角色行为不变, 虚构的新角色「助教」现在默认不是管理员。 Co-Authored-By: Claude Opus 5 --- apps/api/src/routes/helpers.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/api/src/routes/helpers.ts b/apps/api/src/routes/helpers.ts index 5dd1575..e1813be 100644 --- a/apps/api/src/routes/helpers.ts +++ b/apps/api/src/routes/helpers.ts @@ -64,15 +64,24 @@ export function queryInteger( return parsed } +// 角色判断一律用白名单,对齐旧后端 `account/models.py:65-73` 的 is_admin_role / +// is_teacher_or_above 显式列举写法。 +// +// 不要写成黑名单(`adminType !== "Regular User"`):当前四种角色下两者等价,但将来新增 +// 任何角色(助教、家长……)都会**默认拿到管理员权限**,包括 canViewSubmission 里的 +//「看所有人代码」。加角色的人多半想不到要回来改这里,白名单则会默认拒绝。 +const ADMIN_ROLES = ["Student Admin", "Teacher Admin", "Super Admin"] +const TEACHER_ROLES = ["Teacher Admin", "Super Admin"] + // 注意:不要再加 isRegularUser(user) 这类「是普通用户才受限」的判断 —— // 匿名用户 user 为 null 时它返回 false,守卫会整体短路,匿名的权限反而大于登录学生。 // 需要「非管理员即受限」时一律用 !isAdminRole(user)。 export function isAdminRole(user: AuthUser | null | undefined) { - return Boolean(user && user.adminType !== "Regular User") + return Boolean(user && ADMIN_ROLES.includes(user.adminType)) } export function isTeacherOrAbove(user: AuthUser | null | undefined) { - return user?.adminType === "Teacher Admin" || user?.adminType === "Super Admin" + return Boolean(user && TEACHER_ROLES.includes(user.adminType)) } export function isSuperAdmin(user: AuthUser | null | undefined) {