6.4 KiB
Финальное заключение: КЛГ АСУ ТК
Дата: 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 — полная.
Оставшиеся рекомендации (не блокирующие)
- Типизировать API-клиент — заменить
PaginatedResponse<any>на конкретные интерфейсы. Не срочно, но повысит надёжность frontend. - Проверить
storage_dir/INBOX_DATA_DIR—attachments.pyиспользуетsettings.INBOX_DATA_DIR,storage.py—settings.storage_dir. Убедиться, что оба указывают на одну корневую директорию. - Тесты — проверить прохождение после рефакторинга
deps.py(asyncget_current_userможет сломать mock-и в тестах). - В production убрать
ENABLE_DEV_AUTH— в.env.exampleи документации чётко пометить, чтоENABLE_DEV_AUTH=trueдопустим ТОЛЬКО в development.
Заключение
Проект готов к запуску в dev-среде и близок к production-ready прототипу. Все критические уязвимости безопасности устранены. Архитектура соответствует требованиям ТЗ «КЛГ под АСУ ТК».
Рекомендация: готов к demo/UAT.