Files
wwjcloud-nest-v1/wwjcloud-nest-v1/docs/AUTH_FIX.md

152 lines
4.5 KiB
Markdown
Raw Normal View History

# 🔐 认证守卫修复方案
## 📋 问题描述
**严重安全问题**:当前生成的所有 NestJS Controller **没有任何认证守卫**
### Java 项目的认证模式
1. **`adminapi` 路径(管理后台)**
- ✅ 类级别有 `@SaCheckLogin` - 默认所有接口需要认证
- 个别方法用 `@SaIgnore` 跳过认证
2. **`api` 路径(前台接口)**
- ❌ 类级别无 `@SaCheckLogin` - 默认不需要认证
- 个别方法用 `@SaCheckLogin` 标记需要认证
## ✅ 修复方案
### 1. 修改 `java-scanner.js`
**增强 `extractRouteInfo` 方法**,提取认证注解:
- 类级别:`@SaCheckLogin``@SaIgnore`
- 方法级别:`@SaCheckLogin``@SaIgnore`
- 为每个方法添加 `requiresAuth``isPublic` 属性
**新增方法**
- `extractClassAnnotations()` - 提取类级别注解
- `extractMethodAnnotations()` - 提取方法级别注解
### 2. 修改 `controller-generator.js`
**更新导入语句**
```javascript
import { AuthGuard, RbacGuard, Public, Result } from '@wwjBoot';
```
**类级别装饰器**
- `hasClassLevelAuth` → 添加 `@UseGuards(AuthGuard)` + `@ApiBearerAuth()`
- `hasClassLevelIgnore` → 添加 `@Public()`
**方法级别装饰器**(新增 `generateMethodAuthDecorators` 方法):
- 情况1: 类有认证 + 方法 `@SaIgnore` → 方法添加 `@Public()`
- 情况2: 类无认证 + 方法 `@SaCheckLogin` → 方法添加 `@UseGuards(AuthGuard)` + `@ApiBearerAuth()`
## 🎯 预期结果
### AdminAPI Controller (有类级别认证)
```typescript
@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 (无类级别认证)
```typescript
@Controller('api/member')
@ApiTags('API')
export class MemberController {
// 普通方法 - 无需认证
@Get('info')
async getInfo() { ... }
// 需要认证的方法
@Get('member')
@UseGuards(AuthGuard) // ← 方法级别添加认证
@ApiBearerAuth()
async getMember() { ... }
}
```
## 📝 运行迁移
```bash
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` - 应该要求认证
## 🔍 快速检查命令
```bash
# 检查 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 版本的认证行为**完全一致**