fix(用户管理): 修复用户列表页面加载失败问题
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled

修复用户列表页面加载失败导致测试超时的问题,确保页面元素正确渲染
This commit is contained in:
iven
2026-04-19 08:46:28 +08:00
parent 0ee9d22634
commit 841766b168
174 changed files with 26366 additions and 675 deletions

View File

@@ -0,0 +1,90 @@
# 审计问题修复计划(按优先级)
## Context
2026-04-18 系统全面审计发现多个问题(详见 `docs/audit-2026-04-18.md`)。当前系统因 Redis 未安装且限流策略为 fail-closed**所有 API 请求返回 429**,系统完全不可用。本计划按优先级逐步修复,恢复系统可用性。
---
## Fix 1: 限流中间件改为 fail-openP0-3
**问题**: Redis 未安装时fail-closed 策略拒绝所有请求,系统完全不可用。
**文件**: `crates/erp-server/src/middleware/rate_limit.rs`
**改动**:
- `apply_rate_limit()` 中 3 处 Redis 不可达时的处理,从返回 429 改为放行(调用 `next.run(req).await`
- 仅保留 tracing::warn 日志,不阻断业务
- 超限计数本身仍按原逻辑Redis 可达时正常限流,不可达时放行
**涉及行**: 约第 121-129 行、第 138-147 行、第 151-158 行
---
## Fix 2: 插件权限自动分配给 admin 角色P0-1
**问题**: 插件安装时注册权限到 `permissions` 表,但不分配给 admin 角色,导致 JWT 中缺少插件权限码,所有插件数据页面返回 403。
**文件**: `crates/erp-plugin/src/service.rs`
**改动**:
1. 新增 `grant_permissions_to_admin()` 函数(约第 766 行 `register_plugin_permissions` 之后):
- 查询 admin 角色 ID
- 查询当前插件的所有权限 ID按 manifest_id 前缀匹配)
- INSERT INTO role_permissions跳过已存在的记录ON CONFLICT DO NOTHING
- 参考 `crates/erp-auth/src/service/seed.rs` 中的 SQL 模式
2.`install()` 函数(约第 81 行)中,`register_plugin_permissions()` 调用之后,调用 `grant_permissions_to_admin()`
3.`enable()` 函数(约第 191 行)中也调用 `grant_permissions_to_admin()`,确保启用时权限也已分配
**参考文件**:
- `crates/erp-auth/src/service/seed.rs` — 已有的 admin 权限授予模式
- `crates/erp-server/migration/src/m20260417_000034_seed_plugin_permissions.rs` — 迁移中的 SQL 模式
- `crates/erp-plugin/src/handler/data_handler.rs:75``compute_permission_code()` 权限码格式
---
## Fix 3: CRM 插件 WASM 数据修复P0-2
**问题**: 数据库中存储的 CRM 插件 WASM 是错误的测试插件二进制110KB而非真正的 CRM 插件(~22KB。导致服务器重启后插件恢复失败。
**步骤**:
1. 重新编译 CRM 插件 WASM Component
2. 通过插件升级 API 上传正确的二进制
3. 验证插件恢复成功
**命令**:
```bash
cargo build -p erp-plugin-crm --target wasm32-unknown-unknown --release
wasm-tools component new target/wasm32-unknown-unknown/release/erp_plugin_crm.wasm -o target/erp_plugin_crm.component.wasm
```
---
## Fix 4: `/roles/permissions` 路由冲突P1
**问题**: `GET /api/v1/roles/permissions``GET /api/v1/roles/{id}` 路由拦截,`permissions` 被当作 UUID 解析失败。
**文件**: `crates/erp-auth/src/module.rs`
**改动**:
-`register_routes()` 中(约第 64-82 行),将 `/roles/permissions` 精确匹配路由放在 `:id` 参数路由**之前**
- Axum 路由匹配按注册顺序,精确路径优先于参数路径
---
## 验证计划
每个 Fix 完成后独立验证:
1. **Fix 1 验证**: 启动后端,`curl http://localhost:3000/api/v1/health` 返回 200不再 429
2. **Fix 2 验证**: 重新安装/启用 CRM 插件,用 admin 登录后访问 CRM 数据页面不再 403
3. **Fix 3 验证**: 重启后端,日志显示 `Plugins recovered: 1`(而非 0
4. **Fix 4 验证**: `curl -H "Authorization: Bearer <token>" http://localhost:3000/api/v1/roles/permissions` 返回权限列表(非 UUID 错误)
**最终验证**:
- `cargo check` 编译通过
- `cargo test --workspace` 全部通过
- 前端页面正常访问CRM 数据可操作