Implementei um aplicativo React com React Router v6 apresentando rotas aninhadas, proteção de autenticação via componentes AuthProvider e ProtectedRoute, e vários componentes de layout. Estou particularmente preocupado com minha abordagem para proteger rotas e lidar com navegação dentro de seções autenticadas. Essa estrutura de roteamento é considerada uma boa prática ou há melhorias arquitetônicas que eu deveria fazer para melhor manutenibilidade e segurança?
Estas são minhas Rotas Protegidas
import React, { useEffect } from 'react';
import { Navigate, useLocation } from 'react-router-dom';
import { useAuth } from './AuthContext';
import Loader from '../../../components/Loader/Loader';
const ProtectedRoute = ({ children }) => {
const { isAuthenticated, loading } = useAuth();
const location = useLocation();
if (loading) {
return <div><Loader /></div>;
}
if (!isAuthenticated) {
return <Navigate to="/login" state={{ from: location }} replace />;
}
return children;
};
export default ProtectedRoute;
Este é meu componente App.jsx.
const App = () => {
return (
<AuthProvider>
<BrowserRouter>
<Routes>
<Route path="/login" element={<AuthPage />} />
<Route path="/app/" element={ <ProtectedRoute> <LayoutPage /> </ProtectedRoute>}>
<Route index element={<Navigate to="dashboard" />} />
<Route path="dashboard" element={<DashboardPage />} />
<Route path="live-tracking" element={<LiveTracking />} />
<Route path="path-tracking" element={<PathTracker />} />
<Route path="employee-report" element={<EmployeeLayout />}>
<Route index element={<ReportPage />} />
<Route path="employee-details/:id" element={<EmployeeDetailsPage />} />
<Route path="employee-log/:id" element={<EmployeeLogReport />} />
<Route path="create-employee" element={<EmployeeCreation />} />
<Route path="edit-employee/:id" element={<EmployeeCreation />} />
</Route>
<Route path="visitors-report" element={<VisitorsLayout />}>
<Route index element={<VisitorsFrontDesk />} />
<Route path="visitors-history" element={<ReportPage />} />
<Route path="visitors-details/:id" element={<VisitorsDetailsPage />} />
<Route path="create-visitor" element={<VisitorsCreation />} />
<Route path="edit-visitor/:id" element={<VisitorsCreation />} />
</Route>
<Route path="canteen-report" element={<CanteenLayout />}>
<Route index element={<CanteenReportPage />} />
<Route path="employee-food-details/:id" element={<EmployeeFoodPage />} />
<Route path="canteen-event" element={<ReportPage />} />
</Route>
<Route path="settings" element={<SettingsLayout />}>
<Route index element={<Navigate to="profile-setting" />} />
<Route path="profile-setting" element={<ProfileSettings />} />
<Route path="admin-setting" element={<ReportPage />} />
<Route path="access-setting" element={<ReportPage />} />
<Route path="create-access" element={<CreateAccess />} />
<Route path="edit-access/:id" element={<CreateAccess />} />
<Route path="create-admin" element={<CreateAdmin />} />
<Route path="zone-setting" element={<ZoneSettings />} />
<Route path="device-setting" element={<ReportPage />} />
</Route>
<Route path="rfid-details" element={<ReportPage />} />
<Route path="temporary-rfid" element={<VisitorsLayout />}>
<Route index element={<ReportPage />} />
<Route path="temporary-employee" element={<TemporaryVisitorsPage />} />
</Route>
<Route path="restricted" element={<ReportPage />} />
<Route path="malpractice" element={<ReportPage />} />
<Route path="feedback" element={<ReportPage />} />
<Route path="supervicer" element={<ReportPage />} />
<Route path="security" element={<ReportPage />} />
<Route path="*" element={<NotFoundPage />} />
</Route>
<Route path="*" element={ <CheckSession fallback="/login" destination="/app/dashboard"> <NotFoundPage /> </CheckSession> } />
</Routes>
</BrowserRouter>
<ToastContainer />
</AuthProvider>
);
};
const CheckSession = ({ children, fallback, destination }) => {
const hasSession = sessionStorage.getItem('token') !== null;
if (hasSession) {
return children;
}
return <Navigate to={fallback} replace />;
};
export default App;
Considere usar cookies HttpOnly em vez de sessionStorage para armazenamento de tokens para melhorar a segurança
talvez você queira adicionar controle de acesso baseado em funções em rotas protegidas para obter melhores permissões.