检索侧的班级隔离
公开教程 · 无需登录

检索侧的班级隔离

检索与上传共用同一条班级边界。学生与教师均可检索本班材料,且都不能通过修改请求看到其他班级的内容。前端隐藏入口不构成隔离,过滤必须发生在服务端。

1班级标识仅取自会话

登录之后,会话中已存有该用户的 class_id。检索接口被调用之前,认证模块已依据 Cookie 将该用户写入请求上下文。检索模块只从该上下文读取班级;查询字符串、JSON 正文或请求头中另行携带的班级编号,在解析后一律丢弃。

以 A 班身份登录后,即便在请求体中写入 B 班的 class_id,实际过滤条件仍是 A 班,结果中不得出现 B 班的切片。
请求中携带的 class_id 解析后即丢弃 会话中的 class_id 登录时已写入 仅使用该值 查询参数一律无效 MySQL WHERE class_id = 会话班级 Qdrant 同样按 class_id 过滤
仅在单侧过滤并不充分。关键字与向量两条路径都须使用会话中的班级,且在回表查询时再次核对。

2两条路径均须携带班级条件

路径 怎么限定
关键字 MySQL 查询条件包含 class_id = 会话班级,且仅检索 index_status = ready 的切片
向量 Qdrant 查询须带 class_id 过滤;返回向量主键后,再用同一班级条件回 MySQL 取回正文。payload 中的编号不得单独作为正文来源

仅在单侧过滤并不充分。即便向量库漏加过滤条件,回表时的班级约束仍应将其他班级的记录排除在外。

3跨班级检索对外表现为无命中

使用仅存在于 B 班正文中的词,在 A 班发起检索,响应应为 HTTP 200、空的命中列表,或「资料中未找到相关内容」。不应以 403 或 404 向调用方暗示「该资料属于其他班级」。按材料标识打开详情仍沿用第 3 课规则:跨班级与不存在均返回 404。