关键修复: 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 - 验证报告
4.5 KiB
4.5 KiB
🔐 认证守卫修复方案
📋 问题描述
严重安全问题:当前生成的所有 NestJS Controller 没有任何认证守卫!
Java 项目的认证模式
-
adminapi路径(管理后台)- ✅ 类级别有
@SaCheckLogin- 默认所有接口需要认证 - 个别方法用
@SaIgnore跳过认证
- ✅ 类级别有
-
api路径(前台接口)- ❌ 类级别无
@SaCheckLogin- 默认不需要认证 - 个别方法用
@SaCheckLogin标记需要认证
- ❌ 类级别无
✅ 修复方案
1. 修改 java-scanner.js
增强 extractRouteInfo 方法,提取认证注解:
- 类级别:
@SaCheckLogin、@SaIgnore - 方法级别:
@SaCheckLogin、@SaIgnore - 为每个方法添加
requiresAuth和isPublic属性
新增方法:
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
✅ 验证清单
- 检查 adminapi controllers:类级别应该有
@UseGuards(AuthGuard) - 检查 api controllers:类级别不应该有守卫(除非 Java 类有
@SaCheckLogin) - 检查
@SaIgnore方法:应该有@Public()装饰器 - 检查
@SaCheckLogin方法:应该有@UseGuards(AuthGuard)装饰器 - 测试路由:
/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 版本的认证行为完全一致