Story 006.001: Shared-CRUD 数据权限控制完整实现
Status
Ready for Review
Story
As a 业务模块开发者,
I want 在 shared-crud 包中实现完整的数据权限控制功能,
so that 我可以轻松为业务模块配置"用户只能操作自己的数据"的安全需求,同时保持向后兼容性和配置灵活性。
Acceptance Criteria
- 数据权限控制类型定义和配置接口
- 查询操作的自动权限过滤(getList 和 getById)
- 创建操作的权限限制(防止创建不属于自己的数据)
- 更新操作的权限验证
- 删除操作的权限验证
- 权限控制中间件
- 管理员权限覆盖机制
- 完整的单元测试和集成测试
Tasks / Subtasks
Dev Notes
技术栈信息
- 运行时: Node.js 20.18.3 [Source: architecture/tech-stack.md#现有技术栈维护]
- 框架: Hono 4.8.5 [Source: architecture/tech-stack.md#现有技术栈维护]
- 数据库: PostgreSQL 17 + TypeORM 0.3.25 [Source: architecture/tech-stack.md#现有技术栈维护]
- 认证: JWT 9.0.2 [Source: architecture/tech-stack.md#现有技术栈维护]
项目结构
- shared-crud包位置:
packages/shared-crud/ [Source: architecture/source-tree.md#实际项目结构]
- 服务层文件:
packages/shared-crud/src/services/generic-crud.service.ts [Source: architecture/source-tree.md#实际项目结构]
- 路由层文件:
packages/shared-crud/src/routes/generic-crud.routes.ts [Source: architecture/source-tree.md#实际项目结构]
- 类型定义位置:
packages/shared-crud/src/types/ [Source: architecture/source-tree.md#实际项目结构]
现有集成点
- 认证系统: 现有认证中间件提供用户上下文 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#Existing System Context]
- 用户跟踪字段: 现有
userTracking 配置支持创建和更新时自动设置用户ID字段 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#Existing System Context]
- 业务模块实体: 包含用户关联字段(userId, createdBy, updatedBy) [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#Existing System Context]
- 路由层: 需要更新以支持数据权限配置的传递 [Source: packages/shared-crud/src/routes/generic-crud.routes.ts#L21]
数据模型
- 用户实体: 包含
id, username, email, password, roles 等字段 [Source: architecture/data-model-schema-changes.md#现有数据模型状态]
- 角色实体: 包含
id, name, permissions 等字段 [Source: architecture/data-model-schema-changes.md#现有数据模型状态]
- 用户跟踪字段: 业务模块实体通常包含
userId, createdBy, updatedBy 等字段 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#Existing System Context]
API设计
- 认证: JWT Bearer Token [Source: architecture/api-design-integration.md#API集成策略]
- 版本控制: 使用v1前缀 (
/api/v1/) [Source: architecture/api-design-integration.md#API集成策略]
- 错误处理: 权限验证失败返回明确的错误信息 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#技术实现要点]
向后兼容性要求
- 配置可选: 数据权限控制为可选配置,默认禁用 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#技术实现要点]
- API不变: 现有API接口和行为保持不变 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#技术实现要点]
- 性能优化: 权限过滤使用数据库索引,性能影响最小化 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#技术实现要点]
安全性考虑
- 默认安全: 启用权限控制后,默认遵循最小权限原则 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#技术实现要点]
- 输入验证: 所有用户输入进行严格的验证和转义 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#技术实现要点]
- SQL注入防护: 使用参数化查询防止SQL注入 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#技术实现要点]
性能优化
- 数据库索引: 确保用户ID字段有合适的索引 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#技术实现要点]
- 查询优化: 权限过滤条件与现有查询条件合并 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#技术实现要点]
Testing
测试框架和位置
- 测试框架: Vitest + hono/testing [Source: architecture/testing-strategy.md#测试金字塔策略]
- 单元测试位置:
packages/shared-crud/tests/unit/**/*.test.ts [Source: architecture/testing-strategy.md#测试金字塔策略]
- 集成测试位置:
packages/shared-crud/tests/integration/**/*.test.ts [Source: architecture/testing-strategy.md#测试金字塔策略]
- 覆盖率目标: ≥ 80% 单元测试覆盖率 [Source: architecture/testing-strategy.md#测试覆盖率标准]
测试标准
- 测试数据管理: 使用测试数据工厂模式 [Source: architecture/testing-strategy.md#测试数据管理]
- 数据库测试: 集成测试使用专用测试数据库,事务回滚 [Source: architecture/testing-strategy.md#数据库测试策略]
- 测试命名: 使用「应该...」格式描述测试行为 [Source: architecture/testing-strategy.md#测试命名约定]
具体测试要求
- 权限配置验证测试: 验证各种权限配置组合 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#测试策略]
- 查询权限过滤测试: 验证查询操作的正确权限过滤 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#测试策略]
- 创建权限限制测试: 验证创建操作的权限限制 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#测试策略]
- 更新权限验证测试: 验证更新操作的权限验证 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#测试策略]
- 删除权限验证测试: 验证删除操作的权限验证 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#测试策略]
- 路由层配置测试: 验证路由层正确传递数据权限配置 [Source: packages/shared-crud/src/routes/generic-crud.routes.ts#L21]
- 管理员权限覆盖测试: 验证管理员权限覆盖功能 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#测试策略]
- 集成测试: 完整CRUD操作的权限控制测试 [Source: docs/prd/epic-006-shared-crud-data-permission-enhancement.md#测试策略]
Change Log
| Date |
Version |
Description |
Author |
| 2025-11-11 |
1.0 |
初始故事创建 |
Bob (Scrum Master) |
Dev Agent Record
此部分由开发代理在实现过程中填写
Agent Model Used
Debug Log References
Completion Notes List
- 已创建数据权限控制类型定义和配置接口
- 已扩展现有 CrudOptions 接口,添加 dataPermission 配置
- 已实现权限配置验证逻辑
- 已实现查询操作的自动权限过滤
- 已为 getList 方法添加基于用户ID的权限过滤
- 已为 getById 方法添加权限验证
- 已实现权限检查方法,支持管理员权限覆盖和自定义验证器
- 已实现创建操作的权限限制
- 已为 create 方法添加权限验证,防止用户创建不属于自己的数据
- 已验证用户ID字段与当前用户匹配
- 已提供清晰的错误信息
- 已实现更新操作的权限验证
- 已为 update 方法添加权限验证
- 已验证用户是否有权更新目标实体
- 已确保权限验证与现有更新逻辑集成
- 已实现删除操作的权限验证
- 已为 delete 方法添加权限验证
- 已验证用户是否有权删除目标实体
- 已确保权限验证与现有删除逻辑集成
- 已更新路由层以支持数据权限控制
- 已更新 createCrudRoutes 函数参数解构,包含 dataPermission 配置
- 已更新所有路由处理函数,将 dataPermission 配置传递给 CRUD 服务
- 已确保所有 CRUD 操作都正确传递数据权限配置
- 已在路由层统一处理权限错误,返回403状态码而不是500错误
- 已修复只读模式路由的权限错误处理
- 已更新集成测试验证403状态码返回
- 构建验证通过,无类型错误
- 所有单元测试和集成测试通过
File List
QA Results
此部分由QA代理在质量检查后填写