为何要拆分认证模块与材料模块
认证模块回答「本次请求者是谁」,材料模块回答「该用户所属班级有哪些材料」。若材料模块自行解析 Cookie,则两处会各维护一套会话逻辑,调整角色或过期策略时极易遗漏其一。所有需要登录的接口均先经过认证模块;校验通过后,后续代码只从本次请求上下文获取用户信息。
浏览器仅访问本站。静态页面与 /api 请求统一由 Nginx 入口进入;认证、授权、数据隔离与上传校验全部在 Go 服务端完成。数据库不向宿主机映射端口。
上传目录仅挂载到 api 容器,不得被 Nginx 配置为静态资源目录。开发环境中前端代理的 /api 路径与生产环境保持一致,Cookie 因此无需处理跨域问题。
学生应能指出:本次请求终止在哪一层,下一层接收到的输入是什么。下表覆盖第 3 课的全部模块。第 4 课将在 Go 之后追加切分、向量嵌入、Qdrant 与对话模块。
| 模块 | 职责范围 | 不在职责内 |
|---|---|---|
| 浏览器 | 渲染页面;登录后自动携带 Cookie;将文件提交至 /api |
不判定身份,不决定班级归属;隐藏入口不构成访问拒绝 |
| Nginx | 直接返回静态页面文件;路径以 /api 开头的请求原样反向代理至 Go |
不查询会话,不访问 MySQL,不将上传目录暴露为静态目录 |
| 认证模块 | 登录时比对口令哈希并换发新会话;此后每次请求依据 Cookie 解析用户、角色与班级 | 不接受请求头或请求体中自行声明的角色与班级 |
| 材料模块 | 按会话班级提供列表、详情与下载;教师上传时写入文件并更新两张表 | 本课不执行切分、向量嵌入或问答 |
| MySQL | 持久化班级、用户、会话、材料与知识库正文 | 不映射宿主机端口,客户端无法直连 |
| 上传目录 | 仅供 api 容器存放文件;目录名使用班级编号,文件名由服务端生成 | 不接受客户端传入的路径;事务失败时须清理已写入文件 |
以已登录用户打开材料列表为例。若请求未携带 Cookie,则在认证模块即终止并返回 401,材料模块与数据库均不会被访问。
认证模块回答「本次请求者是谁」,材料模块回答「该用户所属班级有哪些材料」。若材料模块自行解析 Cookie,则两处会各维护一套会话逻辑,调整角色或过期策略时极易遗漏其一。所有需要登录的接口均先经过认证模块;校验通过后,后续代码只从本次请求上下文获取用户信息。