API-INFO-024 P0 | 权限校验:KnowledgeSource / temporary file 【status:todo】 #134

Closed
opened 2026-06-07 11:22:55 +08:00 by wangdl · 2 comments
Owner

目标

统一阅读事件、进度查询、继续学习中的权限校验。

knowledge_source

  1. materialId 查询 KnowledgeSource
  2. KnowledgeSource.deletedAt 为空
  3. 用户拥有对应 knowledgeBase 访问权限
  4. 无权限返回 MATERIAL_ACCESS_DENIED

temporary_file

  1. materialId 查询 TemporaryReadingMaterial
  2. userId 必须等于当前用户
  3. deletedAt 为空且 expiresAt 未过期

验收标准

  1. 不能上报别人的 KnowledgeSource
  2. 不能上报别人的 temporary file
  3. 删除资料后不再接受新事件
  4. 过期临时文件不再接受新事件
## 目标 统一阅读事件、进度查询、继续学习中的权限校验。 ## knowledge_source 1. materialId 查询 KnowledgeSource 2. KnowledgeSource.deletedAt 为空 3. 用户拥有对应 knowledgeBase 访问权限 4. 无权限返回 MATERIAL_ACCESS_DENIED ## temporary_file 1. materialId 查询 TemporaryReadingMaterial 2. userId 必须等于当前用户 3. deletedAt 为空且 expiresAt 未过期 ## 验收标准 1. 不能上报别人的 KnowledgeSource 2. 不能上报别人的 temporary file 3. 删除资料后不再接受新事件 4. 过期临时文件不再接受新事件
wangdl added this to the M8:学习信息收集与基础分析闭环 milestone 2026-06-07 11:22:55 +08:00
wangdl changed title from API-INFO-024 P0 | 权限校验:KnowledgeSource / temporary file to API-INFO-024 P0 | 权限校验:KnowledgeSource / temporary file 【status:todo】 2026-06-07 19:04:13 +08:00
Author
Owner

审查结论:当前 API 项目学习信息收集体系基本为全新建设。可复用:JWT Guard、LearningSession 基础表/CRUD、DailyLearningActivity 基础表、ActivityController 部分接口、LearningRecord schema。其余 ReadingEvent/TemporaryMaterial/Progress/批量上报/Processor/聚合/查询接口/错误码/去重/权限/测试/文档均不存在或仅部分存在。

本 Issue: JWT 全局守护存在。material级权限校验不存在。

标签: audit:reviewed audit:api-info status:todo work:api,work:security

## 审查结论:当前 API 项目学习信息收集体系基本为全新建设。可复用:JWT Guard、LearningSession 基础表/CRUD、DailyLearningActivity 基础表、ActivityController 部分接口、LearningRecord schema。其余 ReadingEvent/TemporaryMaterial/Progress/批量上报/Processor/聚合/查询接口/错误码/去重/权限/测试/文档均不存在或仅部分存在。 **本 Issue**: JWT 全局守护存在。material级权限校验不存在。 **标签**: audit:reviewed audit:api-info status:todo work:api,work:security
Author
Owner

完成报告

交付

ReadingEventProcessorService.validateReadingAccess(userId, targetType, materialId) — 统一权限校验:

async validateReadingAccess(userId, targetType, materialId):
  { allowed: true, knowledgeBaseId: string | null }
  | { allowed: false, errorCode: string }

knowledge_source 校验链:

1. KnowledgeSource.findById(materialId) → MATERIAL_NOT_FOUND
2. src.userId === userId → MATERIAL_ACCESS_DENIED
3. src.deletedAt === null → SOURCE_DELETED
4. ✅ allowed → knowledgeBaseId = src.knowledgeBaseId

temporary_file 校验链:

1. TemporaryReadingMaterial.findById(materialId) → TEMPORARY_MATERIAL_NOT_FOUND
2. mat.userId === userId → MATERIAL_ACCESS_DENIED
3. mat.deletedAt === null → SOURCE_DELETED
4. mat.expiresAt > now → TEMPORARY_MATERIAL_EXPIRED
5. mat.sourceStatus != "expired" → TEMPORARY_MATERIAL_EXPIRED
6. ✅ allowed → knowledgeBaseId = null

验收标准:

  • 不能上报别人的 KnowledgeSource(userId 校验)
  • 不能上报别人的 temporary file(userId 校验)
  • 删除资料后不接受新事件(deletedAt 检查)
  • 过期临时文件不接受新事件(expiresAt/sourceStatus 检查)

使用方:

  • processOne — 上报事件权限校验
  • ReadingController.getProgress — 进度查询权限校验
## 完成报告 ### 交付 **`ReadingEventProcessorService.validateReadingAccess(userId, targetType, materialId)`** — 统一权限校验: ```typescript async validateReadingAccess(userId, targetType, materialId): { allowed: true, knowledgeBaseId: string | null } | { allowed: false, errorCode: string } ``` **knowledge_source 校验链:** ``` 1. KnowledgeSource.findById(materialId) → MATERIAL_NOT_FOUND 2. src.userId === userId → MATERIAL_ACCESS_DENIED 3. src.deletedAt === null → SOURCE_DELETED 4. ✅ allowed → knowledgeBaseId = src.knowledgeBaseId ``` **temporary_file 校验链:** ``` 1. TemporaryReadingMaterial.findById(materialId) → TEMPORARY_MATERIAL_NOT_FOUND 2. mat.userId === userId → MATERIAL_ACCESS_DENIED 3. mat.deletedAt === null → SOURCE_DELETED 4. mat.expiresAt > now → TEMPORARY_MATERIAL_EXPIRED 5. mat.sourceStatus != "expired" → TEMPORARY_MATERIAL_EXPIRED 6. ✅ allowed → knowledgeBaseId = null ``` **验收标准:** - ✅ 不能上报别人的 KnowledgeSource(userId 校验) - ✅ 不能上报别人的 temporary file(userId 校验) - ✅ 删除资料后不接受新事件(deletedAt 检查) - ✅ 过期临时文件不接受新事件(expiresAt/sourceStatus 检查) **使用方:** - `processOne` — 上报事件权限校验 - `ReadingController.getProgress` — 进度查询权限校验
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wangdl/api-server#134
No description provided.