# 🚨 ПЛАН УСТРАНЕНИЯ ГЛОБАЛЬНЫХ МАРШРУТОВ И СОЗДАНИЯ РОЛЬ-СПЕЦИФИЧНЫХ КОМПОНЕНТОВ
> **Дата:** 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