Skip to content

04_课程访问控制与权限策略(当前实现)

本文档描述后端目前已实现的课程读写权限与访问控制规则,便于前后端协同与测试。


角色与鉴权

  • 角色:student(学生)、teacher(教师)、school_admin(学校管理员)、platform_admin(平台管理员)
  • 鉴权:采用 Bearer JWT。登录后在请求头中加入 Authorization: Bearer <token>
  • 依赖实现:app/api/deps.py
    • get_current_user:强制登录
    • get_teacher_or_admin:要求教师或管理员(teacher / school_admin / platform_admin)

发布与可见性(publish + visibility)

  • 匿名用户:不可访问课程列表与详情(必须登录)。
  • 发布状态 is_public
    • false(草稿):仅创建者可见;忽略 visibility。
    • true(已发布):按 visibility 放行。
  • 若启用班级范围(Course-Class Scope):
    • 课程发布且存在 scope 绑定时:仅绑定班级成员可见(学校管理员同校放行;平台管理员无视限制)。
    • 未绑定 scope 时再落入 visibility 规则。
  • visibility 取值(仅对已发布生效):
    • private:仅创建者本人可见(外加其自身选修关系)。
    • school:同校用户可见(教师/学生),学校管理员视为同校。
    • public:所有登录用户可见。
  • 普通用户(学生/教师):可见集合 = public ∪ 本人创建/本人加入。
  • 学校管理员(school_admin):可见集合 = public ∪ 本校创建/本校成员加入。
  • 平台管理员(platform_admin):可以看到“所有课程”(忽略 visibility)。
  • 写操作:全部需要“教师或管理员”。
    • 创建/更新/删除课程
    • 章节/步骤的新增、更新、删除、排序与章节课件配置
    • Fork 课程
    • 所有上传接口
  • 创建者字段:创建课程时 created_by 由后端写入为当前登录用户 ID,客户端即使传值也会被覆盖。

接口权限矩阵

接口方法匿名学生教师学校管理员平台管理员备注
/coursesGET不允许草稿仅作者;已发布按 visibility草稿仅作者;已发布按 visibility草稿仅作者;已发布按 visibility全部需登录;草稿仅作者,其余按 visibility
/courses/{id}GET不允许草稿仅作者;已发布按 visibility草稿仅作者;已发布按 visibility草稿仅作者;已发布按 visibility全部需登录;不可见则 403
/courses/{id}/handbookGET不允许限本人可见限本人可见本校可见全部同上,可见性一致
/coursesPOST不允许不允许允许允许允许需教师/管理员;created_by 由后端写入
/courses/{id}PUT/DELETE不允许不允许允许允许允许需教师/管理员
/courses/{id}:forkPOST不允许不允许允许允许允许需教师/管理员;新课程 created_by=当前用户
/courses/{id}/chaptersPOST不允许不允许允许允许允许需教师/管理员
/chapters/{id}GET不限制不限制不限制不限制不限制当前实现未附加课程可见性校验(如需可后续增强)
/chapters/{id}PUT/DELETE不允许不允许允许允许允许需教师/管理员
/courses/{id}/chapters:reorderPOST不允许不允许允许允许允许需教师/管理员
/chapters/{id}/coursewarePUT不允许不允许允许允许允许需教师/管理员
/chapters/{id}/stepsPOST不允许不允许允许允许允许需教师/管理员
/steps/{id}GET不限制不限制不限制不限制不限制当前实现未附加课程可见性校验(如需可后续增强)
/steps/{id}PUT/DELETE不允许不允许允许允许允许需教师/管理员
/upload/{id}/{kind}POST不允许不允许允许允许允许需教师/管理员;kind in [courseware, handbook, textbook]
/meta/coursesGET不允许仅本人创建/加入仅本人创建/加入本校范围全部与主资源列表相同规则

说明:章节与步骤详情(GET)在进入前统一调用课程可见性校验(已接入)。


关键实现位置

  • 可见性查询:CourseService.list_courses_visible_to_userCourseService.ensure_user_can_view_course
  • 课程路由:app/api/courses.py
  • 元数据路由:app/api/meta.py(复用服务层可见性)
  • 上传路由:app/api/uploads.py

示例(curl)

  • 登录获取 Token(示例为种子教师账号)
bash
curl -s -X POST http://localhost:8000/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"username":"teacher","password":"teacher"}'
  • 列出可见课程(登录必需)
bash
curl -s http://localhost:8000/courses -H 'Authorization: Bearer TOKEN'
  • 获取课程详情(登录必需;若不可见返回 403)
bash
curl -i http://localhost:8000/courses/1 -H 'Authorization: Bearer TOKEN'