Files
erp/plans/optimized-orbiting-hickey.md
iven 841766b168
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
fix(用户管理): 修复用户列表页面加载失败问题
修复用户列表页面加载失败导致测试超时的问题,确保页面元素正确渲染
2026-04-19 08:46:28 +08:00

91 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 审计问题修复计划(按优先级)
## 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 数据可操作