Защищённые маршруты и охрана авторизации
Перенаправляйте неавторизованных пользователей на страницу входа с помощью обёрточных компонентов или защит на основе загрузчиков.
«Защищённые маршруты и охрана авторизации» — бесплатный урок React Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Зачем защищать маршруты
Некоторые страницы (панель управления, профиль и раздел администратора) должны быть доступны только аутентифицированным пользователям. React Router предоставляет два подхода: компоненты-обёртки и проверки на основе загрузчиков.
Структура состояния аутентификации
Сначала создайте context аутентификации, из которого компоненты смогут узнать, вошёл ли пользователь в систему.
const AuthContext = React.createContext(null);
function AuthProvider({ children }) {
const [user, setUser] = useState(null);
const login = async (creds) => { const u = await apiLogin(creds); setUser(u); };
const logout = () => setUser(null);
return (
<AuthContext.Provider value={{ user, login, logout }}>
{children}
</AuthContext.Provider>
);
}
export const useAuth = () => useContext(AuthContext);Защита с помощью компонента-обёртки
Создайте компонент PrivateRoute, который проверяет аутентификацию и перенаправляет пользователя на страницу входа, если пользователь не прошёл аутентификацию.
import { Navigate, Outlet } from 'react-router-dom';
function PrivateRoute() {
const { user } = useAuth();
if (!user) return <Navigate to="/login" replace />;
return <Outlet />;
}
// Usage in router:
{ element: <PrivateRoute />, children: [
{ path: '/dashboard', element: <Dashboard /> },
]}Сохранение URL перенаправления
Сохраните URL, к которому пользователь пытался обратиться, чтобы после входа вернуть его туда. Передайте этот URL через свойство состояния компоненту Navigate.
function PrivateRoute() {
const { user } = useAuth();
const location = useLocation();
if (!user) {
return <Navigate to="/login" state={{ from: location }} replace />;
}
return <Outlet />;
}
// In login handler:
const location = useLocation();
const from = location.state?.from?.pathname || '/';
navigate(from, { replace: true });Защита на основе загрузчика (Data Router)
В API Data Router добавьте проверку аутентификации в loader маршрута. Если пользователь не аутентифицирован, выбросьте перенаправление.
import { redirect } from 'react-router-dom';
function requireAuth() {
const token = localStorage.getItem('token');
if (!token) throw redirect('/login');
return token;
}
const router = createBrowserRouter([
{
path: '/dashboard',
loader: requireAuth,
element: <Dashboard />,
},
]);Проверки на основе ролей
Расширьте проверку, добавив проверку ролей. Перенаправляйте пользователя на страницу отказа в доступе, если у него нет требуемой роли.
function AdminRoute() {
const { user } = useAuth();
if (!user) return <Navigate to="/login" replace />;
if (user.role !== 'admin') return <Navigate to="/unauthorized" replace />;
return <Outlet />;
}Состояние загрузки во время проверки аутентификации
Если состояние аутентификации загружается асинхронно, например с сервера, показывайте индикатор загрузки, пока проверка ожидает завершения, чтобы пользователь не успевал увидеть страницу входа.
function PrivateRoute() {
const { user, isLoading } = useAuth();
if (isLoading) return <Spinner />;
if (!user) return <Navigate to="/login" replace />;
return <Outlet />;
}Защита нескольких маршрутов одновременно
Объедините все защищённые маршруты под одной оболочкой PrivateRoute, чтобы не дублировать проверку для каждого маршрута.
const router = createBrowserRouter([
{ path: '/login', element: <Login /> },
{
element: <PrivateRoute />,
children: [
{ path: '/dashboard', element: <Dashboard /> },
{ path: '/profile', element: <Profile /> },
{ path: '/settings', element: <Settings /> },
],
},
]);Обработка истечения срока действия токена
Проверяйте срок действия token внутри проверки или глобального перехватчика и выполняйте выход пользователя, когда token истекает, перенаправляя его на страницу входа.
function isTokenValid(token) {
const payload = JSON.parse(atob(token.split('.')[1]));
return payload.exp * 1000 > Date.now();
}
function requireAuth() {
const token = localStorage.getItem('token');
if (!token || !isTokenValid(token)) throw redirect('/login');
return token;
}Поток обновления токена
Перед перенаправлением при ответе 401 попытайтесь обновить token. Перенаправляйте пользователя на страницу входа только в случае неудачи обновления.
async function requireAuth() {
let token = localStorage.getItem('token');
if (!token || isExpired(token)) {
token = await refreshToken();
if (!token) throw redirect('/login');
localStorage.setItem('token', token);
}
return token;
}Сохранение аутентификации после перезагрузки
Храните token аутентификации в localStorage или в файле cookie HttpOnly. При загрузке приложения восстановите состояние аутентификации до отображения защищённых маршрутов.
Быстрая проверка
Что следует выбросить при использовании проверки аутентификации на основе загрузчика в React Router, чтобы перенаправить неаутентифицированного пользователя?
Итоги
Защищайте маршруты с помощью оболочки PrivateRoute, использующей <Outlet />, или загрузчика, который выбрасывает redirect(). Сохраняйте исходный URL в состоянии навигации, обрабатывайте состояния загрузки, чтобы избежать кратковременного отображения страниц, и объединяйте защищённые маршруты, чтобы не дублировать код.
Изучай React с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 88
- Уроки
- 324
Часто задаваемые вопросы
Урок «Защищённые маршруты и охрана авторизации» бесплатный?
Да — полный текст урока «Защищённые маршруты и охрана авторизации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Защищённые маршруты и охрана авторизации»?
Перенаправляйте неавторизованных пользователей на страницу входа с помощью обёрточных компонентов или защит на основе загрузчиков. Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Защищённые маршруты и охрана авторизации»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Вложенные маршруты и макеты Outlet
- Загрузчики и действия (API маршрутизатора данных)
- Защищённые маршруты и охрана авторизации
- Управление состоянием в параметрах поиска URL