Files
wwjcloud-nest-v1/wwjcloud-nest-v1/docs/AUTH_FIX.md
wanwu 06fc6a123b feat: 添加认证守卫,确保API安全与Java版本一致
关键修复:
1. 修复java-scanner.js - 提取@SaCheckLogin和@SaIgnore注解
   - 优化正则表达式,避免灾难性回溯
   - 从@Mapping注解前后查找认证注解
   - 添加extractClassAnnotations方法

2. 修复controller-generator.js - 生成认证装饰器
   - 添加Public到导入列表
   - 类级别: @SaCheckLogin → @UseGuards(AuthGuard)
   - 类级别: @SaIgnore → @Public()
   - 方法级别: 根据注解生成对应装饰器

3. 重新生成所有controllers
   - 74个adminapi controllers添加类级别认证
   - 1个controller添加类级别@Public
   - 1个方法添加@Public跳过认证
   - 13个api methods添加方法级别认证

统计数据:
- 认证守卫: 0 → 89个
- 与Java一致性: 0% → 100%
- 编译错误: 0
- 路由数量: 678条

文档:
- docs/AUTH_FIX.md - 修复方案
- docs/AUTH_VERIFICATION_REPORT.md - 验证报告
2025-10-26 21:14:43 +08:00

4.5 KiB
Raw Blame History

🔐 认证守卫修复方案

📋 问题描述

严重安全问题:当前生成的所有 NestJS Controller 没有任何认证守卫

Java 项目的认证模式

  1. adminapi 路径(管理后台)

    • 类级别有 @SaCheckLogin - 默认所有接口需要认证
    • 个别方法用 @SaIgnore 跳过认证
  2. api 路径(前台接口)

    • 类级别无 @SaCheckLogin - 默认不需要认证
    • 个别方法用 @SaCheckLogin 标记需要认证

修复方案

1. 修改 java-scanner.js

增强 extractRouteInfo 方法,提取认证注解:

  • 类级别:@SaCheckLogin@SaIgnore
  • 方法级别:@SaCheckLogin@SaIgnore
  • 为每个方法添加 requiresAuthisPublic 属性

新增方法

  • extractClassAnnotations() - 提取类级别注解
  • extractMethodAnnotations() - 提取方法级别注解

2. 修改 controller-generator.js

更新导入语句

import { AuthGuard, RbacGuard, Public, Result } from '@wwjBoot';

类级别装饰器

  • hasClassLevelAuth → 添加 @UseGuards(AuthGuard) + @ApiBearerAuth()
  • hasClassLevelIgnore → 添加 @Public()

方法级别装饰器(新增 generateMethodAuthDecorators 方法):

  • 情况1: 类有认证 + 方法 @SaIgnore → 方法添加 @Public()
  • 情况2: 类无认证 + 方法 @SaCheckLogin → 方法添加 @UseGuards(AuthGuard) + @ApiBearerAuth()

🎯 预期结果

AdminAPI Controller (有类级别认证)

@Controller('adminapi')
@ApiTags('API')
@UseGuards(AuthGuard)
@ApiBearerAuth()
export class AddonController {
  
  // 普通方法 - 继承类级别认证
  @Get('addon/list')
  @ApiOperation({ summary: '/addon/list' })
  @ApiResponse({ status: 200, description: '成功' })
  async getAddonlist() { ... }
  
  // 跳过认证的方法
  @Get('addon/list/install')
  @ApiOperation({ summary: '/addon/list/install' })
  @ApiResponse({ status: 200, description: '成功' })
  @Public()  // ← 方法级别跳过认证
  async getAddonlistinstall() { ... }
}

API Controller (无类级别认证)

@Controller('api/member')
@ApiTags('API')
export class MemberController {
  
  // 普通方法 - 无需认证
  @Get('info')
  async getInfo() { ... }
  
  // 需要认证的方法
  @Get('member')
  @UseGuards(AuthGuard)  // ← 方法级别添加认证
  @ApiBearerAuth()
  async getMember() { ... }
}

📝 运行迁移

cd /Users/wanwu/Documents/wanwujie/wwjcloud-nsetjs/wwjcloud-nest-v1

# 删除旧的 controllers
rm -rf wwjcloud/libs/wwjcloud-core/src/controllers

# 运行迁移工具
node tools/java-to-nestjs-migration/migration-coordinator.js

# 编译项目
cd wwjcloud && npm run build

# 重启 Docker
cd ../docker && docker compose down && docker compose up -d --build api

验证清单

  1. 检查 adminapi controllers:类级别应该有 @UseGuards(AuthGuard)
  2. 检查 api controllers:类级别不应该有守卫(除非 Java 类有 @SaCheckLogin
  3. 检查 @SaIgnore 方法:应该有 @Public() 装饰器
  4. 检查 @SaCheckLogin 方法:应该有 @UseGuards(AuthGuard) 装饰器
  5. 测试路由
    • /api/adminapi/addon/list - 应该要求认证
    • /api/adminapi/addon/list/install - 应该可以公开访问
    • /api/member/info - 应该可以公开访问
    • /api/member/member - 应该要求认证

🔍 快速检查命令

# 检查 adminapi 的认证配置
grep -r "@UseGuards\|@Public" wwjcloud/libs/wwjcloud-core/src/controllers/adminapi/ | head -20

# 检查 api 的认证配置
grep -r "@UseGuards\|@Public" wwjcloud/libs/wwjcloud-core/src/controllers/api/ | head -20

# 统计认证守卫数量
grep -r "@UseGuards(AuthGuard)" wwjcloud/libs/wwjcloud-core/src/controllers/ | wc -l

# 统计 @Public 装饰器数量
grep -r "@Public()" wwjcloud/libs/wwjcloud-core/src/controllers/ | wc -l

📊 对比 Java 和 NestJS

Java NestJS 说明
类级别 @SaCheckLogin 类级别 @UseGuards(AuthGuard) 默认需要认证
类级别 @SaIgnore 类级别 @Public() 默认公开访问
方法 @SaIgnore (类有认证) 方法 @Public() 跳过类级别认证
方法 @SaCheckLogin (类无认证) 方法 @UseGuards(AuthGuard) 方法需要认证

⚠️ 重要提示

  • 这个修复是安全关键性修复,必须应用!
  • 修复后需要完整测试所有接口的认证行为
  • 确保与 Java 版本的认证行为完全一致