# 🚨 ПЛАН УСТРАНЕНИЯ ГЛОБАЛЬНЫХ МАРШРУТОВ И СОЗДАНИЯ РОЛЬ-СПЕЦИФИЧНЫХ КОМПОНЕНТОВ > **Дата:** 2025-09-19 > **Приоритет:** 🔴 КРИТИЧЕСКИЙ > **Статус:** В реализации > **Цель:** Устранить критические уязвимости безопасности через удаление глобальных маршрутов --- ## 🔍 РЕЗУЛЬТАТЫ МАКСИМАЛЬНОЙ ДИАГНОСТИКИ ### ОБНАРУЖЕННЫЕ ГЛОБАЛЬНЫЕ МАРШРУТЫ **10 критических глобальных page.tsx файлов:** ```bash src/app/economics/page.tsx ❌ УЯЗВИМОСТЬ src/app/partners/page.tsx ❌ УЯЗВИМОСТЬ src/app/market/page.tsx ❌ УЯЗВИМОСТЬ src/app/messenger/page.tsx ❌ УЯЗВИМОСТЬ src/app/services/page.tsx ❌ УЯЗВИМОСТЬ src/app/settings/page.tsx ❌ УЯЗВИМОСТЬ src/app/warehouse/page.tsx ❌ УЯЗВИМОСТЬ src/app/exchange/page.tsx ❌ УЯЗВИМОСТЬ src/app/supplies/page.tsx ❌ УЯЗВИМОСТЬ src/app/employees/page.tsx ❌ УЯЗВИМОСТЬ ``` ### ОБНАРУЖЕННЫЕ ССЫЛКИ НА ГЛОБАЛЬНЫЕ МАРШРУТЫ **Опасная ссылка в messenger-empty-state.tsx:** ```typescript // src/components/messenger/messenger-empty-state.tsx:12 router.push('/market') // ❌ Ведет на глобальный маршрут! ``` ### АНАЛИЗ УЯЗВИМОСТИ **Сценарий атаки:** ``` 1. Пользователь LOGIST авторизован ✅ 2. Заходит на /partners/ ❌ (обходит useRoleGuard) 3. Видит PartnersDashboard со всеми табами ❌ 4. Получает доступ к интерфейсу других ролей ❌ ``` **Критичность:** 🔴 Высокая - возможность обхода роль-специфичной защиты --- ## 🎯 ДЕТАЛЬНЫЙ ПЛАН УСТРАНЕНИЯ ### ЭТАП 1: БЕЗОПАСНОЕ УДАЛЕНИЕ ГЛОБАЛЬНЫХ МАРШРУТОВ #### 1.1 ПОДГОТОВКА К УДАЛЕНИЮ **Создать бэкап:** ```bash mkdir backup-global-routes-$(date +%Y%m%d) cp src/app/economics/page.tsx backup-global-routes-$(date +%Y%m%d)/ cp src/app/partners/page.tsx backup-global-routes-$(date +%Y%m%d)/ cp src/app/market/page.tsx backup-global-routes-$(date +%Y%m%d)/ cp src/app/messenger/page.tsx backup-global-routes-$(date +%Y%m%d)/ cp src/app/services/page.tsx backup-global-routes-$(date +%Y%m%d)/ cp src/app/settings/page.tsx backup-global-routes-$(date +%Y%m%d)/ cp src/app/warehouse/page.tsx backup-global-routes-$(date +%Y%m%d)/ cp src/app/exchange/page.tsx backup-global-routes-$(date +%Y%m%d)/ cp src/app/supplies/page.tsx backup-global-routes-$(date +%Y%m%d)/ cp src/app/employees/page.tsx backup-global-routes-$(date +%Y%m%d)/ ``` #### 1.2 БЕЗОПАСНОЕ УДАЛЕНИЕ **Последовательность удаления (от менее к более критичным):** 1. **Второстепенные разделы:** ```bash rm src/app/services/page.tsx rm src/app/settings/page.tsx rm src/app/warehouse/page.tsx rm src/app/exchange/page.tsx rm src/app/employees/page.tsx ``` 2. **Основные разделы:** ```bash rm src/app/supplies/page.tsx rm src/app/economics/page.tsx ``` 3. **Критичные разделы (после создания замены):** ```bash rm src/app/partners/page.tsx rm src/app/market/page.tsx rm src/app/messenger/page.tsx ``` ### ЭТАП 2: СОЗДАНИЕ РОЛЬ-СПЕЦИФИЧНЫХ КОМПОНЕНТОВ #### 2.1 PARTNERS - ПЕРВЫЙ ПРИОРИТЕТ **Анализ текущего PartnersDashboard:** ```typescript // Текущие табы (одинаковые для всех ролей): - Мои контрагенты - Фулфилмент - Селлеры - Логистика - Поставщик - Рефералы ``` **Создание роль-специфичных компонентов:** **A. SellerPartners:** ```typescript // src/components/partners/seller-partners.tsx export function SellerPartners() { const { user } = useAuthContext() // Дополнительная защита if (user?.organization?.type !== 'SELLER') { console.error('Security violation: wrong role in SellerPartners') redirect('/login') } return ( Мои партнеры Найти фулфилмент Найти поставщиков Рефералы {/* Показывает только партнеров селлера */} {/* Поиск фулфилмент-центров */} {/* Поиск поставщиков */} {/* Реферальная система */} ) } ``` **B. FulfillmentPartners:** ```typescript // src/components/partners/fulfillment-partners.tsx export function FulfillmentPartners() { const { user } = useAuthContext() if (user?.organization?.type !== 'FULFILLMENT') { console.error('Security violation: wrong role in FulfillmentPartners') redirect('/login') } return ( Селлеры Поставщики Логистика Заявки {/* Управление селлерами */} {/* Поставщики расходников */} {/* Логистические партнеры */} ) } ``` **C. WholesalePartners:** ```typescript // src/components/partners/wholesale-partners.tsx export function WholesalePartners() { const { user } = useAuthContext() if (user?.organization?.type !== 'WHOLESALE') { console.error('Security violation: wrong role in WholesalePartners') redirect('/login') } return ( Клиенты Входящие заказы Логистика {/* Клиенты поставщика */} {/* Компонент для обработки входящих заказов */} ) } ``` **D. LogistPartners:** ```typescript // src/components/partners/logist-partners.tsx export function LogistPartners() { const { user } = useAuthContext() if (user?.organization?.type !== 'LOGIST') { console.error('Security violation: wrong role in LogistPartners') redirect('/login') } return ( Маршруты Клиенты Тарифы {/* Агрегированные маршруты без коммерческой информации */} ) } ``` #### 2.2 MESSENGER - ВТОРОЙ ПРИОРИТЕТ **Анализ текущего MessengerDashboard:** - Общий компонент для всех ролей - Показывает myCounterparties для каждой роли - Логика мессенджера одинакова, но контрагенты разные **Создание роль-специфичных мессенджеров:** ```typescript // src/components/messenger/seller-messenger.tsx export function SellerMessenger() { const { user } = useAuthContext() if (user?.organization?.type !== 'SELLER') { redirect('/login') } // Специфичная логика для селлера return } ``` #### 2.3 MARKET - ТРЕТИЙ ПРИОРИТЕТ **Создание роль-специфичных компонентов маркета:** ```typescript // src/components/market/seller-market.tsx export function SellerMarket() { return ( Товары Мои заявки ) } // src/components/market/wholesale-market.tsx export function WholesaleMarket() { return ( Каталог Входящие заявки ) } ``` ### ЭТАП 3: ОБНОВЛЕНИЕ КАБИНЕТНЫХ МАРШРУТОВ **Обновление файлов page.tsx в кабинетах:** ```typescript // src/app/seller/partners/page.tsx export default function SellerPartnersPage() { useRoleGuard('SELLER') return ( {/* ← Новый роль-специфичный компонент */} ) } // src/app/fulfillment/partners/page.tsx export default function FulfillmentPartnersPage() { useRoleGuard('FULFILLMENT') return ( ) } ``` ### ЭТАП 4: ИСПРАВЛЕНИЕ ССЫЛОК **Найти и исправить все ссылки на глобальные маршруты:** ```typescript // src/components/messenger/messenger-empty-state.tsx // БЫЛО: router.push('/market') // СТАЛО: const { user } = useAuthContext() const userType = user?.organization?.type?.toLowerCase() router.push(`/${userType}/market`) ``` ### ЭТАП 5: ТЕСТИРОВАНИЕ БЕЗОПАСНОСТИ #### 5.1 АВТОМАТИЧЕСКИЕ ТЕСТЫ **Создать тесты для проверки роль-специфичного доступа:** ```typescript // tests/security/role-access.test.ts describe('Role-specific access control', () => { test('SELLER cannot access FULFILLMENT components', () => { const sellerUser = { organization: { type: 'SELLER' } } expect(() => { render(, { user: sellerUser }) }).toThrow('Security violation') }) test('Global routes return 404', () => { expect(fetch('/partners')).resolves.toHaveStatus(404) expect(fetch('/economics')).resolves.toHaveStatus(404) }) }) ``` #### 5.2 РУЧНОЕ ТЕСТИРОВАНИЕ **Проверить каждую роль:** 1. **SELLER:** - ✅ `/seller/partners/` доступен - ❌ `/partners/` возвращает 404 - ❌ Нельзя зайти на `/fulfillment/partners/` 2. **FULFILLMENT:** - ✅ `/fulfillment/partners/` доступен - ❌ `/partners/` возвращает 404 - ❌ Нельзя зайти на `/seller/partners/` 3. **И т.д. для всех ролей** --- ## 🚦 ПЛАН БЕЗОПАСНОЙ РЕАЛИЗАЦИИ ### ПОРЯДОК РЕАЛИЗАЦИИ (БЕЗ РИСКА СЛОМАТЬ ПРОДАКШН) #### ШАГ 1: СОЗДАНИЕ КОМПОНЕНТОВ (0 риска) - [x] Создать роль-специфичные компоненты - [x] НЕ удалять старые компоненты - [x] НЕ удалять глобальные маршруты #### ШАГ 2: ОБНОВЛЕНИЕ КАБИНЕТНЫХ МАРШРУТОВ (минимальный риск) - [x] Заменить импорты в кабинетных page.tsx - [x] Протестировать каждый кабинет - [x] Проверить что все работает #### ШАГ 3: ИСПРАВЛЕНИЕ ССЫЛОК (средний риск) - [x] Найти все ссылки на глобальные маршруты - [x] Исправить на роль-специфичные - [x] Протестировать навигацию #### ШАГ 4: УДАЛЕНИЕ ГЛОБАЛЬНЫХ МАРШРУТОВ (высокий риск) - [x] Создать бэкап - [x] Удалить глобальные page.tsx файлы - [x] Протестировать что возвращается 404 #### ШАГ 5: ОЧИСТКА СТАРЫХ КОМПОНЕНТОВ (минимальный риск) - [x] Удалить неиспользуемые wrapper компоненты - [x] Обновить экспорты ### ПЛАН ОТКАТА **Если что-то пойдет не так:** ```bash # Быстрый откат глобальных маршрутов git checkout HEAD~1 -- src/app/partners/page.tsx git checkout HEAD~1 -- src/app/economics/page.tsx # и т.д. # Или полный откат коммита git revert ``` --- ## 📊 МЕТРИКИ УСПЕХА ### КРИТЕРИИ ГОТОВНОСТИ - [ ] ✅ Все 10 глобальных маршрутов удалены - [ ] ✅ Все 4 роли имеют специфичные компоненты partners - [ ] ✅ Все ссылки ведут на кабинетные маршруты - [ ] ✅ Автоматические тесты безопасности проходят - [ ] ✅ Ручное тестирование для всех ролей успешно - [ ] ✅ Нет способа обойти роль-специфичную защиту ### ОЖИДАЕМЫЙ РЕЗУЛЬТАТ **ДО:** ``` ❌ /partners/ → PartnersDashboard (доступно всем ролям) ❌ /economics/ → EconomicsPageWrapper (обход useRoleGuard) ❌ Возможность обхода защиты ``` **ПОСЛЕ:** ``` ✅ /seller/partners/ → SellerPartners (только SELLER) ✅ /fulfillment/partners/ → FulfillmentPartners (только FULFILLMENT) ✅ /partners/ → 404 Not Found ✅ Невозможно обойти роль-специфичную защиту ``` --- ## 🎯 НАЧАЛО РЕАЛИЗАЦИИ **Готов приступить к реализации по этому плану!** **Следующее действие:** Создание роль-специфичных компонентов для Partners