Просмотр исходного кода

✨ feat(middleware): 增强权限中间件日志功能

- 添加操作开始日志记录,包含请求方法和路径信息
- 实现操作成功日志,记录执行耗时
- 修改错误日志为操作失败类型,增加请求上下文信息
- 统一日志格式,在reason字段中添加[method path]前缀

♻️ refactor(service): 优化用户跟踪字段设置逻辑

- 调整userTrackingOptions默认值处理方式
- 移除不必要的条件判断,简化代码逻辑
- 注释掉未使用的DataPermissionConfig接口定义
yourname 7 месяцев назад
Родитель
Сommit
3a4a243741

+ 49 - 20
src/server/middleware/permission-auto-log.middleware.ts

@@ -24,35 +24,64 @@ export function permissionWithAutoLog(requiredPermissions: string[]) {
     // 获取相关ID
     const relatedId = params.id || null;
     
-    try {
-      // 执行权限检查
-      const hasPermission = await permissionChecker(user);
-      
-      if (!hasPermission) {
-        // 记录权限拒绝
-        await logService.create({
-          id: generateLogId(),
-          class: resourceClass,
-          action: 'permission_denied',
-          relatedId: relatedId ? String(relatedId) : undefined,
-          reason: `权限被拒绝: 需要权限 ${requiredPermissions.join(', ')}`,
-          logTime: new Date()
-        }, user?.id);
-        
-        return c.json({ message: '没有权限访问该资源', code: 403 }, 403);
-      }
+    // 记录操作开始时间
+    const startTime = Date.now();
+    
+    // 执行权限检查
+    const hasPermission = await permissionChecker(user);
+    
+    if (!hasPermission) {
+      // 记录权限拒绝
+      await logService.create({
+        id: generateLogId(),
+        class: resourceClass,
+        action: 'permission_denied',
+        relatedId: relatedId ? String(relatedId) : undefined,
+        reason: `[${method} ${path}] 权限被拒绝: 需要权限 ${requiredPermissions.join(', ')}`,
+        logTime: new Date()
+      }, user?.id);
       
+      return c.json({ message: '没有权限访问该资源', code: 403 }, 403);
+    }
+    
+    // 记录操作开始
+    await logService.create({
+      id: generateLogId(),
+      class: resourceClass,
+      action: 'operation_started',
+      relatedId: relatedId ? String(relatedId) : undefined,
+      reason: `[${method} ${path}] 开始执行操作,权限: ${requiredPermissions.join(', ')}`,
+      logTime: new Date()
+    }, user?.id);
+    
+    try {
       // 继续执行后续处理
       await next();
       
+      // 计算执行时间
+      const duration = Date.now() - startTime;
+      
+      // 记录操作成功
+      await logService.create({
+        id: generateLogId(),
+        class: resourceClass,
+        action: 'operation_success',
+        relatedId: relatedId ? String(relatedId) : undefined,
+        reason: `[${method} ${path}] 操作成功完成,耗时: ${duration}ms`,
+        logTime: new Date()
+      }, user?.id);
+      
     } catch (error) {
-      // 记录权限检查异常
+      // 计算执行时间
+      const duration = Date.now() - startTime;
+      
+      // 记录操作失败
       await logService.create({
         id: generateLogId(),
         class: resourceClass,
-        action: 'permission_error',
+        action: 'operation_failed',
         relatedId: relatedId ? String(relatedId) : undefined,
-        reason: `权限检查异常: ${error instanceof Error ? error.message : '未知错误'}`,
+        reason: `[${method} ${path}] 操作执行失败: ${error instanceof Error ? error.message : '未知错误'}`,
         logTime: new Date()
       }, user?.id);
       

+ 9 - 8
src/server/utils/generic-crud.service.ts

@@ -152,11 +152,11 @@ export abstract class GenericCrudService<T extends ObjectLiteral> {
    * 设置用户跟踪字段
    */
   private setUserFields(data: any, userId?: string | number, isCreate: boolean = true): void {
-    if (!this.userTrackingOptions || !userId) {
+    if (!userId) {
       return;
     }
 
-    const { createdByField = 'createdBy', updatedByField = 'updatedBy' } = this.userTrackingOptions;
+    const { createdByField = 'createdBy', updatedByField = 'updatedBy' } = this.userTrackingOptions || {};
 
     if (isCreate && createdByField) {
       data[createdByField] = userId;
@@ -165,6 +165,7 @@ export abstract class GenericCrudService<T extends ObjectLiteral> {
     if (updatedByField) {
       data[updatedByField] = userId;
     }
+
   }
 
   /**
@@ -208,12 +209,12 @@ export interface UserTrackingOptions {
   updatedByField?: string;
 }
 
-export interface DataPermissionConfig {
-  entity: string;
-  userIdField: string;
-  departmentIdField?: string;
-  responsibleUserIdField?: string;
-}
+// export interface DataPermissionConfig {
+//   entity: string;
+//   userIdField: string;
+//   departmentIdField?: string;
+//   responsibleUserIdField?: string;
+// }
 
 export type CrudOptions<
   T extends ObjectLiteral,