Защита роутов в React без копипасты. Как я это решил.
На каждом проекте нужно защищать роуты. Одни — только для авторизованных пользователей, другие — для администраторов, третьи — только для гостей. Пишете PrivateRoute. Потом хук с проверкой роли. Потом компонент HasAccess. Переходите на следующий проект — и пишете всё заново.
Логика всегда одна. Реализация всегда разная.
react-protected стандартизирует это. Описываете что нужно каждому роуту — библиотека проверяет доступ и делает редирект.
Три пакета
@react-protected/core — фреймворк-агностик логика контроля доступа. Без зависимостей от React и роутера.
@react-protected/react — React-контекст (AccessProvider), хуки (useHasAccess) и компонент HasAccess.
@react-protected/react-router — адаптер для React Router. Включает всё из @react-protected/react — устанавливать оба пакета не нужно.
Установка
Для проектов с React Router:
Для React-проектов без React Router:
Конфигурационный стиль (рекомендуется)
JSX стиль
Роли, привилегии или оба варианта
RBAC — передаёте roles в конфигурацию роута. Логику проверки определяете сами: OR, AND, иерархия — как требует ваш домен.
ABAC — передаёте permissions. Работает по тому же принципу.
Оба сразу — проверка проходит только когда выполнены оба условия.
Защита UI-элементов
Защиты роутов недостаточно. HasAccess и useHasAccess позволяют скрывать кнопки, поля и любые UI-элементы на основе роли или привилегии — без смены маршрута.
Callback URL
Если указан `callbackUrlParam`, незалогиненный пользователь редиректится с сохранением текущего пути:
После логина обработайте возврат:
Если нужно отключить callback URL после явного выхода из системы:
Не используете React Router?
Используйте @react-protected/core напрямую с любым роутером. Пример с TanStack Router: