Appearance
04_课程访问控制与权限策略(当前实现)
本文档描述后端目前已实现的课程读写权限与访问控制规则,便于前后端协同与测试。
角色与鉴权
- 角色:student(学生)、teacher(教师)、school_admin(学校管理员)、platform_admin(平台管理员)
- 鉴权:采用 Bearer JWT。登录后在请求头中加入
Authorization: Bearer <token> - 依赖实现:
app/api/deps.pyget_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,客户端即使传值也会被覆盖。
接口权限矩阵
| 接口 | 方法 | 匿名 | 学生 | 教师 | 学校管理员 | 平台管理员 | 备注 |
|---|---|---|---|---|---|---|---|
/courses | GET | 不允许 | 草稿仅作者;已发布按 visibility | 草稿仅作者;已发布按 visibility | 草稿仅作者;已发布按 visibility | 全部 | 需登录;草稿仅作者,其余按 visibility |
/courses/{id} | GET | 不允许 | 草稿仅作者;已发布按 visibility | 草稿仅作者;已发布按 visibility | 草稿仅作者;已发布按 visibility | 全部 | 需登录;不可见则 403 |
/courses/{id}/handbook | GET | 不允许 | 限本人可见 | 限本人可见 | 本校可见 | 全部 | 同上,可见性一致 |
/courses | POST | 不允许 | 不允许 | 允许 | 允许 | 允许 | 需教师/管理员;created_by 由后端写入 |
/courses/{id} | PUT/DELETE | 不允许 | 不允许 | 允许 | 允许 | 允许 | 需教师/管理员 |
/courses/{id}:fork | POST | 不允许 | 不允许 | 允许 | 允许 | 允许 | 需教师/管理员;新课程 created_by=当前用户 |
/courses/{id}/chapters | POST | 不允许 | 不允许 | 允许 | 允许 | 允许 | 需教师/管理员 |
/chapters/{id} | GET | 不限制 | 不限制 | 不限制 | 不限制 | 不限制 | 当前实现未附加课程可见性校验(如需可后续增强) |
/chapters/{id} | PUT/DELETE | 不允许 | 不允许 | 允许 | 允许 | 允许 | 需教师/管理员 |
/courses/{id}/chapters:reorder | POST | 不允许 | 不允许 | 允许 | 允许 | 允许 | 需教师/管理员 |
/chapters/{id}/courseware | PUT | 不允许 | 不允许 | 允许 | 允许 | 允许 | 需教师/管理员 |
/chapters/{id}/steps | POST | 不允许 | 不允许 | 允许 | 允许 | 允许 | 需教师/管理员 |
/steps/{id} | GET | 不限制 | 不限制 | 不限制 | 不限制 | 不限制 | 当前实现未附加课程可见性校验(如需可后续增强) |
/steps/{id} | PUT/DELETE | 不允许 | 不允许 | 允许 | 允许 | 允许 | 需教师/管理员 |
/upload/{id}/{kind} | POST | 不允许 | 不允许 | 允许 | 允许 | 允许 | 需教师/管理员;kind in [courseware, handbook, textbook] |
/meta/courses | GET | 不允许 | 仅本人创建/加入 | 仅本人创建/加入 | 本校范围 | 全部 | 与主资源列表相同规则 |
说明:章节与步骤详情(GET)在进入前统一调用课程可见性校验(已接入)。
关键实现位置
- 可见性查询:
CourseService.list_courses_visible_to_user、CourseService.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'