Защищённые роуты (Protected Routes) позволяют ограничивать доступ к
определённым страницам приложения в зависимости от состояния
пользователя — авторизован он или нет. В экосистеме
React и библиотеке MUI для создания
интерфейсов это достигается сочетанием маршрутизации через
react-router-dom и управления состоянием
аутентификации.
Для начала требуется подключить react-router-dom и
определить базовую структуру маршрутов:
import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom';
import Dashboard from './pages/Dashboard';
import Login from './pages/Login';
import Profile from './pages/Profile';
import NotFound from './pages/NotFound';
Routes и Route создают иерархию маршрутов,
а Navigate позволяет перенаправлять пользователя в
зависимости от условий аутентификации.
Ключевой элемент — компонент ProtectedRoute, который проверяет статус пользователя и решает, разрешить доступ или перенаправить на страницу входа.
import React from 'react';
import { Navigate } from 'react-router-dom';
const ProtectedRoute = ({ isAuthenticated, children }) => {
if (!isAuthenticated) {
return <Navigate to="/login" replace />;
}
return children;
};
export default ProtectedRoute;
Разбор ключевых моментов:
replace предотвращает
возврат на защищённый роут при нажатии кнопки «Назад».Для визуальной части используют компоненты MUI, например
Container, Typography, Button.
Рассмотрим пример защищённой страницы:
import React from 'react';
import { Container, Typography, Button } from '@mui/material';
const Dashboard = ({ onLogout }) => {
return (
<Container maxWidth="md" sx={{ mt: 4 }}>
<Typography variant="h4" gutterBottom>
Панель управления
</Typography>
<Typography variant="body1" sx={{ mb: 2 }}>
Добро пожаловать! Здесь отображаются ваши персональные данные.
</Typography>
<Button variant="contained" color="primary" onCl ick={onLogout}>
Выйти
</Button>
</Container>
);
};
export default Dashboard;
Использование MUI обеспечивает единый стиль интерфейса, при этом позволяет легко добавлять адаптивные элементы и системные темы.
function App() {
const [isAuthenticated, setIsAuthenticated] = React.useState(false);
const handleLogin = () => setIsAuthenticated(true);
const handleLogout = () => setIsAuthenticated(false);
return (
<Router>
<Routes>
<Route path="/login" element={<Login onLo gin={handleLogin} />} />
<Route
path="/dashboard"
element={
<ProtectedRoute isAuthenticated={isAuthenticated}>
<Dashboard onLog out={handleLogout} />
</ProtectedRoute>
}
/>
<Route
path="/profile"
element={
<ProtectedRoute isAuthenticated={isAuthenticated}>
<Profile />
</ProtectedRoute>
}
/>
<Route path="*" element={<NotFound />} />
</Routes>
</Router>
);
}
Особенности:
ProtectedRoute.isAuthenticated можно хранить глобально через
Context API или Redux для масштабных приложений.onLogin и onLogout управляют изменением
состояния авторизации.Для масштабных приложений рекомендуется создавать
AuthContext, чтобы не передавать
isAuthenticated через props:
import React, { createContext, useContext, useState } from 'react';
const AuthContext = createContext();
export const useAuth = () => useContext(AuthContext);
export const AuthProvider = ({ children }) => {
const [isAuthenticated, setIsAuthenticated] = useState(false);
const login = () => setIsAuthenticated(true);
const logout = () => setIsAuthenticated(false);
return (
<AuthContext.Provider value={{ isAuthenticated, login, logout }}>
{children}
</AuthContext.Provider>
);
};
Использование:
const { isAuthenticated } = useAuth();
<ProtectedRoute isAuthenticated={isAuthenticated}>
<Dashboard />
</ProtectedRoute>
Это позволяет централизованно управлять доступом ко всем защищённым маршрутам и упрощает интеграцию с компонентами MUI.
Backdrop или CircularProgress
при проверке состояния авторизации для улучшения пользовательского
опыта.Snackbar для уведомлений о необходимости
входа в систему.sx пропсы MUI для точного позиционирования
элементов на защищённых страницах.ProtectedRoute, проверяя user.role и
предоставляя доступ только определённым группам.React.lazy и Suspense для динамической
подгрузки защищённых компонентов, чтобы ускорить рендеринг
приложения.Эта структура защищённых роутов с MUI обеспечивает гибкость, поддерживает единый стиль интерфейса и легко масштабируется для сложных веб-приложений.