fix(Minor M1): 角色判断改回白名单

isAdminRole 之前写成 `adminType !== "Regular User"`。当前四种角色下与旧后端等价,
但将来新增任何角色(助教、家长……)都会默认拿到管理员权限,包括 canViewSubmission
里的「看所有人代码」——加角色的人多半想不到要回来改这里。

改成显式列举,对齐 account/models.py:65-73。实测四种已知角色行为不变,
虚构的新角色「助教」现在默认不是管理员。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-07 07:00:58 -06:00
parent ced8f3ee1b
commit 97c54d38b5

View File

@@ -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) {