Implemented rbac

This commit is contained in:
2026-10-11 11:16:08 +02:00
parent 45a6c0aca0
commit 1142cfd94e
24 changed files with 3033 additions and 432 deletions
+103 -12
View File
@@ -3,6 +3,7 @@ import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
import { QueryClientProvider } from '@tanstack/react-query';
import { queryClient } from './lib/queryClient';
import { AuthProvider, ProtectedRoute, TenantAdminProtectedRoute } from './auth/AuthProvider';
import { ClaimProtectedRoute, useRbac } from './auth/rbac';
import { ToastProvider } from './components/ui/Toast';
import { AppLayout } from './components/layout/AppLayout';
@@ -27,6 +28,18 @@ const RouteLoading = () => (
</div>
);
const DefaultRouteRedirect = () => {
const { canView } = useRbac();
if (canView('dashboard')) return <Navigate to="/dashboard" replace />;
if (canView('projects_milestones')) return <Navigate to="/projects" replace />;
if (canView('grant_financials')) return <Navigate to="/grants" replace />;
if (canView('evidence_risks')) return <Navigate to="/monitoring" replace />;
if (canView('governance')) return <Navigate to="/governance" replace />;
if (canView('beneficiaries')) return <Navigate to="/projects/beneficiaries" replace />;
if (canView('settings_users') || canView('settings_invites')) return <Navigate to="/settings" replace />;
return <Navigate to="/projects" replace />;
};
export default function App() {
return (
<QueryClientProvider client={queryClient}>
@@ -47,17 +60,94 @@ export default function App() {
</ProtectedRoute>
}
>
<Route path="/dashboard" element={<ExecutiveDashboard />} />
<Route path="/governance" element={<GovernancePage />} />
<Route path="/projects" element={<ProjectsPage />} />
<Route path="/projects/beneficiaries" element={<BeneficiariesPage />} />
<Route path="/beneficiaries" element={<BeneficiariesPage />} />
<Route path="/projects/change-management" element={<ChangeManagementPage />} />
<Route path="/change-management" element={<ChangeManagementPage />} />
<Route path="/projects/site-visits" element={<SiteVisitsPage />} />
<Route path="/site-visits" element={<SiteVisitsPage />} />
<Route path="/grants" element={<GrantsPage />} />
<Route path="/monitoring" element={<MonitoringPage />} />
<Route
path="/dashboard"
element={
<ClaimProtectedRoute claim="dashboard">
<ExecutiveDashboard />
</ClaimProtectedRoute>
}
/>
<Route
path="/governance"
element={
<ClaimProtectedRoute claim="governance">
<GovernancePage />
</ClaimProtectedRoute>
}
/>
<Route
path="/projects"
element={
<ClaimProtectedRoute claim="projects_milestones">
<ProjectsPage />
</ClaimProtectedRoute>
}
/>
<Route
path="/projects/beneficiaries"
element={
<ClaimProtectedRoute claim="beneficiaries">
<BeneficiariesPage />
</ClaimProtectedRoute>
}
/>
<Route
path="/beneficiaries"
element={
<ClaimProtectedRoute claim="beneficiaries">
<BeneficiariesPage />
</ClaimProtectedRoute>
}
/>
<Route
path="/projects/change-management"
element={
<ClaimProtectedRoute claim="change_management">
<ChangeManagementPage />
</ClaimProtectedRoute>
}
/>
<Route
path="/change-management"
element={
<ClaimProtectedRoute claim="change_management">
<ChangeManagementPage />
</ClaimProtectedRoute>
}
/>
<Route
path="/projects/site-visits"
element={
<ClaimProtectedRoute claim="site_visits">
<SiteVisitsPage />
</ClaimProtectedRoute>
}
/>
<Route
path="/site-visits"
element={
<ClaimProtectedRoute claim="site_visits">
<SiteVisitsPage />
</ClaimProtectedRoute>
}
/>
<Route
path="/grants"
element={
<ClaimProtectedRoute claim="grant_financials">
<GrantsPage />
</ClaimProtectedRoute>
}
/>
<Route
path="/monitoring"
element={
<ClaimProtectedRoute claim="evidence_risks">
<MonitoringPage />
</ClaimProtectedRoute>
}
/>
<Route
path="/tenants"
element={
@@ -78,7 +168,7 @@ export default function App() {
</Route>
{/* Fallback Redirect */}
<Route path="*" element={<Navigate to="/dashboard" replace />} />
<Route path="*" element={<DefaultRouteRedirect />} />
</Routes>
</Suspense>
</ToastProvider>
@@ -87,3 +177,4 @@ export default function App() {
</QueryClientProvider>
);
}