Przeglądaj źródła

📝 docs(story): 更新共享CRUD数据权限文档
- 将"实现创建操作的权限限制"任务标记为已完成
- 添加创建操作权限限制的详细实现说明

✨ feat(shared-crud): 实现创建操作的数据权限验证
- 添加权限验证逻辑,防止用户创建不属于自己的数据
- 验证数据中的用户ID字段与当前用户匹配
- 当权限验证失败时抛出清晰的错误信息

yourname 1 miesiąc temu
rodzic
commit
dcd7f24430

+ 8 - 4
docs/stories/006.001.shared-crud-data-permission.story.md

@@ -27,10 +27,10 @@ Draft
   - [x] 在 `getList` 方法中添加基于用户ID的权限过滤
   - [x] 在 `getById` 方法中添加权限验证
   - [x] 确保权限过滤与现有查询条件正确合并
-- [ ] 实现创建操作的权限限制 (AC: 3)
-  - [ ] 在 `create` 方法中添加权限验证,防止用户创建不属于自己的数据
-  - [ ] 验证用户ID字段与当前用户匹配
-  - [ ] 提供清晰的错误信息
+- [x] 实现创建操作的权限限制 (AC: 3)
+  - [x] 在 `create` 方法中添加权限验证,防止用户创建不属于自己的数据
+  - [x] 验证用户ID字段与当前用户匹配
+  - [x] 提供清晰的错误信息
 - [ ] 实现更新操作的权限验证 (AC: 4)
   - [ ] 在 `update` 方法中添加权限验证
   - [ ] 验证用户是否有权更新目标实体
@@ -143,6 +143,10 @@ Draft
 - 已为 getList 方法添加基于用户ID的权限过滤
 - 已为 getById 方法添加权限验证
 - 已实现权限检查方法,支持管理员权限覆盖和自定义验证器
+- 已实现创建操作的权限限制
+- 已为 create 方法添加权限验证,防止用户创建不属于自己的数据
+- 已验证用户ID字段与当前用户匹配
+- 已提供清晰的错误信息
 - 构建验证通过,无类型错误
 
 ### File List

+ 11 - 0
packages/shared-crud/src/services/generic-crud.service.ts

@@ -285,6 +285,17 @@ export abstract class GenericCrudService<T extends ObjectLiteral> {
    * 创建实体
    */
   async create(data: DeepPartial<T>, userId?: string | number): Promise<T> {
+    // 权限验证:防止用户创建不属于自己的数据
+    if (this.dataPermissionOptions?.enabled && userId) {
+      const userIdField = this.dataPermissionOptions.userIdField;
+
+      // 如果数据中已经包含用户ID字段,验证是否与当前用户匹配
+      const dataObj = data as any;
+      if (dataObj[userIdField] && dataObj[userIdField] !== userId) {
+        throw new Error('无权创建该资源');
+      }
+    }
+
     const entityData = { ...data };
     this.setUserFields(entityData, userId, true);