103 lines
6.4 KiB
Markdown
103 lines
6.4 KiB
Markdown
# Финальное заключение: КЛГ АСУ ТК
|
||
|
||
**Дата:** 15 февраля 2026
|
||
**Ревизия:** 3 (после двух итераций исправлений)
|
||
**Репозиторий:** github.com/yrippert-maker/klg-asutk-app
|
||
**Коммиты:** 4 (initial → consolidation → security fix → missing files)
|
||
|
||
---
|
||
|
||
## Резюме
|
||
|
||
Проект прошёл через два цикла исправлений. **Все 18 выявленных проблем** из первого ревью адресованы. Из них **17 полностью исправлены**, **1 косметическая** (R-2).
|
||
|
||
### Общая оценка
|
||
|
||
| Категория | Первая проверка | Сейчас |
|
||
|-----------|:-:|:-:|
|
||
| Запускается ли приложение? | ❌ 6+ ImportError | ✅ Все модули на месте |
|
||
| Backend (API, бизнес-логика) | 🟡 | 🟢 |
|
||
| Frontend (React/Next.js) | 🟡 | 🟢 |
|
||
| Безопасность | 🔴 | 🟢 |
|
||
| Архитектура и соответствие ТЗ | 🟢 | 🟢 |
|
||
|
||
---
|
||
|
||
## Проверка всех исправлений
|
||
|
||
### ✅ Полностью исправлено (17 из 18)
|
||
|
||
| # | Проблема | Файл | Проверено |
|
||
|---|----------|------|-----------|
|
||
| 1 | `oidc.py` не существует | `deps.py` переписан → `security.py` | ✅ |
|
||
| 2 | Два модуля авторизации | Единая цепочка deps→security | ✅ |
|
||
| 3 | Fallback на admin без токена | Без токена → 401 Always | ✅ |
|
||
| 4 | `rate_limit.py` отсутствует | Создан, TokenBucket алгоритм | ✅ |
|
||
| 5 | `helpers.py` отсутствует | Создан, расширенный (audit, tenant, pagination) | ✅ |
|
||
| 6 | `ws_manager.py` отсутствует | Создан, полная реализация + домен-уведомления | ✅ |
|
||
| 7 | `risk_scheduler.py` отсутствует | Создан, APScheduler + ФГИС sync | ✅ |
|
||
| 8 | `email_service.py` отсутствует | Создан, SMTP + шаблоны + stub | ✅ |
|
||
| 9 | `request_logger.py` отсутствует | Создан, с X-Response-Time | ✅ |
|
||
| 10 | AUTH_DEPENDENCY не применялся | Все роутеры защищены | ✅ |
|
||
| 11 | Path traversal в attachments | `Path.resolve()` + startswith check | ✅ |
|
||
| 12 | Нет проверки владельца (attachments) | `is_authority` + `uploaded_by_user_id` | ✅ |
|
||
| 13 | Дефолтный SECRET_KEY | `${SECRET_KEY:?...}` — обязательный | ✅ |
|
||
| 14 | Keycloak и приложение на одной БД | Отдельный `keycloak-db` сервис | ✅ |
|
||
| 15 | CSP: unsafe-eval + api.openai.com | Убраны; connect-src включает api.anthropic.com | ✅ |
|
||
| 16 | Токен в sessionStorage | Только in-memory `_token` | ✅ |
|
||
| R-1 | `setup_scheduler` не вызывался в lifespan | В lifespan перед `yield` вызывается `setup_scheduler(app)` | ✅ |
|
||
|
||
### 📝 Косметическое (1)
|
||
|
||
**R-2: Deprecated `lib/api.ts` удалён, но `Aircraft` дублируется**
|
||
|
||
Интерфейс `Aircraft` перемещён в `api-client.ts` с `[key: string]: any` — типизация всё ещё слабая. Не блокирует работу, но стоит заменить `any` на конкретные типы в будущем.
|
||
|
||
---
|
||
|
||
## Качество созданных файлов
|
||
|
||
Cursor создал файлы не как минимальные заглушки, а как **полноценные реализации** с доменной логикой:
|
||
|
||
| Файл | Качество | Примечания |
|
||
|------|----------|------------|
|
||
| `helpers.py` | 🟢 Отлично | `diff_changes`, tenant filtering, org caching |
|
||
| `ws_manager.py` | 🟢 Отлично | Room-based + user/org routing, домен-специфичные notify-функции (AD, дефекты, AOG, LifeLimit) |
|
||
| `risk_scheduler.py` | 🟢 Отлично | APScheduler 6ч + ФГИС РЭВС авто-sync 24ч, graceful degradation |
|
||
| `email_service.py` | 🟢 Отлично | SMTP + stub, шаблоны для критических алертов, singleton |
|
||
| `request_logger.py` | 🟢 Хорошо | X-Response-Time header, skip health/metrics, аудит regulator-доступа |
|
||
| `rate_limit.py` | 🟢 Хорошо | TokenBucket алгоритм вместо простого sliding window, skip health/docs |
|
||
|
||
---
|
||
|
||
## Архитектура после исправлений
|
||
|
||
```
|
||
Запрос → RateLimitMiddleware → RequestLoggerMiddleware → CORS
|
||
→ AUTH_DEPENDENCY (deps.py → security.py → OIDC/Keycloak)
|
||
→ Роутер (RBAC через require_roles)
|
||
→ Бизнес-логика → DB (RLS по org_id)
|
||
→ Audit trail (helpers.audit)
|
||
→ WebSocket уведомления (ws_manager)
|
||
→ Ответ
|
||
```
|
||
|
||
Цепочка безопасности: Rate limit → Logging → Auth → RBAC → RLS → Audit — полная.
|
||
|
||
---
|
||
|
||
## Оставшиеся рекомендации (не блокирующие)
|
||
|
||
1. **Типизировать API-клиент** — заменить `PaginatedResponse<any>` на конкретные интерфейсы. Не срочно, но повысит надёжность frontend.
|
||
2. **Проверить `storage_dir` / `INBOX_DATA_DIR`** — `attachments.py` использует `settings.INBOX_DATA_DIR`, `storage.py` — `settings.storage_dir`. Убедиться, что оба указывают на одну корневую директорию.
|
||
3. **Тесты** — проверить прохождение после рефакторинга `deps.py` (async `get_current_user` может сломать mock-и в тестах).
|
||
4. **В production убрать `ENABLE_DEV_AUTH`** — в `.env.example` и документации чётко пометить, что `ENABLE_DEV_AUTH=true` допустим ТОЛЬКО в development.
|
||
|
||
---
|
||
|
||
## Заключение
|
||
|
||
Проект **готов к запуску в dev-среде** и близок к production-ready прототипу. Все критические уязвимости безопасности устранены. Архитектура соответствует требованиям ТЗ «КЛГ под АСУ ТК».
|
||
|
||
**Рекомендация: готов к demo/UAT.**
|