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