Autorisatiematrix — EA Transport
Formele vastlegging van wie wat mag zien en doen, zoals daadwerkelijk afgedwongen in het webdashboard (rolgebaseerde navigatie in components/DashboardNav.tsx, servergezijdige rolcontroles per pagina, en Row Level Security per bedrijf in de database).
| Rol | Overzicht | Nieuwe order | Orders | Planning | Chauffeurs | Mijn orders | Klanten | Facturen | Instellingen |
|---|---|---|---|---|---|---|---|---|---|
| Admin (beheerder) | ✓ | ✓ | ✓ | ✓ | ✓ | — | ✓ | ✓ | ✓ |
| Planner | ✓ | ✓ | ✓ (lezen/schrijven) | ✓ | ✓ | — | ✓ (lezen) | — | — |
| Finance | ✓ | — | ✓ (alleen-lezen) | — | — | — | ✓ (lezen) | ✓ | — |
| Driver (chauffeur) | — | — | — | — | — | ✓ (alleen eigen orders) | — | — | — |
Handhaving (technisch, niet alleen procedureel)
- Database-niveau (Row Level Security): elke query is server-side beperkt tot het eigen bedrijf via
current_company_id()— een gebruiker kan nooit data van een ander bedrijf opvragen, ongeacht wat de applicatielaag toestaat (supabase/migrations/0002_auth_and_rls.sql). Dit is live geverifieerd: een testbedrijf kreeg gegarandeerd nul rijen van een ander bedrijf te zien. - Applicatie-niveau (rolcontrole per pagina): elke dashboardpagina controleert zelf de rol van de ingelogde gebruiker (bv.
/dashboard/planningweigert toegang aan iedereen behalveadmin/planner), niet alleen door het navigatie-item te verbergen. - Chauffeur-scoping: een chauffeur ziet alleen orders die aan zijn eigen
driver_idzijn toegewezen; het markeren van een order als afgeleverd wordt server-side gevalideerd (niet alleen client-side verborgen). - Accountbeheer: nieuwe accounts ontstaan uitsluitend via uitnodiging door een bedrijfsbeheerder (
app/api/internal/users/invite/route.ts) — geen self-serve registratie, dus geen ongecontroleerde rol-toekenning. - Kritieke acties atomisch en gevalideerd: het toewijzen van een chauffeur aan een order gebeurt via een database-functie (
assign_driver_to_order) die zelf controleert dat order én chauffeur bij het eigen bedrijf horen, de chauffeur beschikbaar is en voldoende laadvermogen heeft — dit is los getest en een cross-bedrijf-poging wordt aantoonbaar geweigerd.
Nog niet geïmplementeerd
- MFA-verplichting voor de rollen admin en finance — nu technisch mogelijk via Supabase Auth, nog niet afgedwongen. Voorzien zodra er meerdere klanten met echte financiële gegevens op draaien.
- Granulaire rollen binnen een bedrijf (bijvoorbeeld finance beperkt tot alleen-lezen zonder debiteurenbeheer) — bewust uitgesteld; niet relevant voor de doelgroep van 2-10 trucks.