152 lines
4.5 KiB
Markdown
152 lines
4.5 KiB
Markdown
|
|
# 🔐 认证守卫修复方案
|
|||
|
|
|
|||
|
|
## 📋 问题描述
|
|||
|
|
|
|||
|
|
**严重安全问题**:当前生成的所有 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 版本的认证行为**完全一致**
|
|||
|
|
|