Så lägger du till rollbaserad åtkomstkontroll (RBAC) i din app
För att lägga till rollbaserad åtkomstkontroll ger du varje användare en eller flera roller (till exempel admin, redaktör, läsare), definierar vilka åtgärder varje roll får utföra och kontrollerar dessa behörigheter på servern för varje förfrågan, inte bara genom att dölja knappar. Kontrollera också att posten som öppnas tillhör användarens konto eller team. Börja med några fasta roller i din databas, och testa genom att försöka nå en annan användares data direkt.
Autentisering kontra auktorisering
Två ord som ofta blandas ihop:
- Autentisering är vem är du? — att logga in. Se så lägger du till inloggning i din app.
- Auktorisering är vad får du göra? — vilka sidor, poster och åtgärder en inloggad användare kan nå.
RBAC är det vanligaste sättet att göra auktorisering på. Det är viktigt: per september 2026 är Broken Access Control nummer ett i OWASP Top 10:2025, den allmänt använda listan över de allvarligaste säkerhetsriskerna i webbappar. Typiska fel är att användare läser andra användares poster genom att ändra ett ID i URL:en, eller att vanliga användare anropar API-rutter som bara är till för admin.
Välj en modell
| Modell | Så fungerar den | Bra för | Avvägning |
|---|---|---|---|
| En rollkolumn | users.role = admin / member | Små appar med två eller tre roller | Blir rörigt när folk behöver olika roller på olika ställen |
| Roller + behörigheter | Roller kopplas till namngivna behörigheter (invoices.approve); koden kontrollerar behörigheter | Appar vars regler kommer att växa | Fler tabeller; en behörighetslista att underhålla |
| Roller per team (multitenant) | En medlemstabell: användare + organisation + roll | SaaS där folk tillhör team eller arbetsytor | Varje fråga måste avgränsas till organisationen |
| Attribut- eller relationsbaserad | Regler på postens attribut ("författaren får redigera sitt eget inlägg") eller på relationer (delat med) | Dokument, delning, komplexa arbetsflöden | Svårare att resonera kring; överväg ett särskilt bibliotek eller en tjänst |
| Roller hos inloggningsleverantören | Din inloggningsleverantör lagrar roller eller organisationsmedlemskap | Appar som redan använder en hostad inloggningsleverantör | Bunden till den leverantören; tillämpa fortfarande på din server |
I praktiken kombinerar de flesta appar två saker: roller för vilken typ av åtgärder någon får utföra, och ägande för vilka poster de får utföra dem på. "Redaktörer får redigera inlägg" är en rollregel; "…inlägg i deras egen arbetsyta" är en ägarregel. Du behöver båda.
Börja enklare än du tror. Admin, medlem och läsare räcker för förvånansvärt många appar. Det är lättare att dela upp en roll senare än att reda ut tio roller som ingen förstår.
Designa rollerna innan du skriver kod
Skriv en behörighetstabell i vanligt språk först. Den fungerar både som specifikation för AI:n och som din testplan:
| Åtgärd | Ägare | Admin | Medlem | Läsare |
|---|---|---|---|---|
| Visa projekt i teamet | ✓ | ✓ | ✓ | ✓ |
| Skapa och redigera projekt | ✓ | ✓ | ✓ | |
| Ta bort projekt | ✓ | ✓ | ||
| Bjuda in och ta bort personer | ✓ | ✓ | ||
| Ändra roller | ✓ | |||
| Fakturering | ✓ |
Bestäm också gränsfallen: kan den sista ägaren lämna? Kan en admin ta bort ägaren? Vad ser en borttagen användare?
Steg för steg
1. Ha fungerande inloggning först
RBAC ligger ovanpå autentiseringen. Servern måste på ett tillförlitligt sätt veta vem som gör varje förfrågan, från en session eller en verifierad token, aldrig från ett användar-ID som webbläsaren skickar i förfrågans brödtext.
2. Lagra roller i databasen
För en app med ett enda team räcker en kolumn role på användare. För team använder du en medlemstabell:
create table memberships (
user_id uuid references users(id),
organization_id uuid references organizations(id),
role text not null check (role in ('owner','admin','member','viewer')),
primary key (user_id, organization_id)
);
Låt aldrig användare sätta sin egen roll via en vanlig profiluppdatering. Rolländringar går via en särskild endpoint med behörighetskontroll.
3. Kontrollera behörigheter på servern, på ett ställe
Skriv en hjälpfunktion, till exempel can(user, 'projects.delete', project), och anropa den i varje API-rutt, serveråtgärd och bakgrundsjobb som läser eller ändrar data. En central funktion är lättare att granska och testa än kontroller utspridda i koden. Neka som standard: om ingen regel tillåter en åtgärd, nekas den.
4. Avgränsa varje fråga
Varje fråga efter teamdata ska inkludera teamet: where organization_id = :currentOrg, inte bara where id = :id. Det är detta som hindrar någon från att ändra /projects/123 till /projects/124 och se ett annat företags projekt. Svara "hittades inte" i stället för "förbjudet" för poster i andra team, så att du inte avslöjar att de finns.
5. Lägg till skydd på databasnivå där det gör störst nytta
Postgres radnivåsäkerhet (RLS) låter databasen avgöra vilka rader varje användare kan se. Den är avgörande om webbläsaren pratar direkt med databasen (som med vissa hostade backends), och ett användbart andra lager för känsliga tabeller annars.
6. Spegla roller i gränssnittet
Dölj eller inaktivera nu det användare inte får göra, så att appen inte blir förvirrande. Detta är bara för användbarhetens skull; det är serverkontrollerna som skyddar.
7. Logga känsliga åtgärder
Spara vem som ändrade roller, tog bort data eller exporterade poster, och när. En granskningslogg hjälper vid supportfrågor och incidenter.
8. Testa som en angripare
Logga in som varje roll och prova varje åtgärd i behörighetstabellen. Prova sedan sådant som inte ska fungera: anropa admin-API-rutter som läsare, ändra ID:n i URL:er och förfrågningar, ta bort dig själv som sista ägare. Automatiserade tester för behörighetstabellen är värda att skriva när reglerna har satt sig.
Prompter som fungerar
Lägg till rollbaserad åtkomstkontroll. Roller per organisation: owner, admin, member, viewer, lagrade i en medlemstabell. Behörigheterna finns i denna tabell: [klistra in din tabell]. Skapa en enda serverhjälpfunktion can(user, action, resource), neka som standard, och använd den i varje API-rutt. Avgränsa varje fråga med organization_id. Dölj åtgärder som användaren inte kan utföra i gränssnittet, men förlita dig aldrig på det för säkerheten.
Granska varje API-rutt och serverfunktion i den här appen. För varje en, lista vilken data den läser eller ändrar, om den kontrollerar att användaren är inloggad, om den kontrollerar deras roll och om den avgränsar frågan till deras organisation. Åtgärda alla som saknar en kontroll och visa mig listan.
Lägg till en sida /admin enbart för admin där ägaren kan ändra medlemmars roller. Förhindra att den sista ägaren tas bort eller degraderas, logga varje rolländring med vem som gjorde den och när, och se till att endpointen för rolländring avvisar alla som inte är ägare.
Vanliga misstag
- Att bara kontrollera roller i gränssnittet. API:et är fortfarande öppet för vem som helst som anropar det.
- Att lita på ID:n från klienten, till exempel ett
userIdellerrolei förfrågans brödtext i stället för i sessionen. - Oavgränsade frågor som hämtar efter enbart post-ID.
- Roller kontrollerade på sidor men inte på API-rutter, exporter, filnedladdningar eller webhooks.
- Admin via e-postadress hårdkodad i koden (
if email === 'me@...'), vilket är lätt att glömma och svårt att ändra. - För många roller för tidigt, som ingen kan förklara sex månader senare.
- Inaktuella sessioner: en degraderad användare behåller admin-rättigheter tills de loggar ut. Kontrollera roller från databasen, eller uppdatera dem, vid känsliga åtgärder.
Checklista för RBAC
- Behörighetstabell skriven i vanligt språk, gränsfall avgjorda
- Servern känner till användaren från sessionen, aldrig från förfrågningsdata
- Roller lagrade i databasen; användare kan inte ändra sina egna
- En central behörighetskontroll, neka som standard, använd i varje rutt
- Varje fråga avgränsad till användarens organisation eller ägande
- Radnivåsäkerhet där webbläsaren kan nå databasen
- Gränssnittet döljer det användare inte kan göra (endast för användbarheten)
- Känsliga åtgärder loggade
- Varje roll testad, inklusive direkta API-anrop och ändrade ID:n
Åtkomstkontroll är en punkt på en längre lista; säkerhetschecklistan för AI-byggda appar täcker resten. Om du bygger ett verktyg för din egen personal visar så bygger du ett internt verktyg var roller passar in.
RBAC på Mythex
Mythex tillhandahåller inget inbyggt inloggnings- eller rollsystem för din apps användare. Du väljer ett autentiseringsbibliotek eller en leverantör och beskriver rollerna, och agenten kopplar in dem i din kod och i projektets Postgres-databas (lägg till inloggning i din app). Mythex egna arbetsytroller, som Owner och Member, styr vem som kan redigera dina Mythex-projekt, inte vem som kan använda appen du publicerar. Använd planeringsläget för att komma överens om behörighetstabellen innan du bygger, använd sedan granskningsprompten ovan och testa varje roll i förhandsgranskningen innan du publicerar. Dokumentationens säkerhetsprompter är en användbar uppföljning.
Frågor
Vad är rollbaserad åtkomstkontroll?
Rollbaserad åtkomstkontroll (RBAC) avgör vad varje användare får göra utifrån de roller de har, till exempel admin, redaktör eller läsare. Behörigheter kopplas till roller i stället för till enskilda personer, så att ändra vad någon får göra innebär att ändra deras roll.
Vad är skillnaden mellan autentisering och auktorisering?
Autentisering kontrollerar vem någon är, oftast genom inloggning. Auktorisering avgör vad den inloggade personen får se och göra. RBAC är ett sätt att göra auktorisering på.
Räcker det att dölja knappar i gränssnittet för att begränsa åtkomst?
Nej. Vem som helst kan anropa ditt API direkt, så att dölja en knapp ändrar bara vad folk ser. Varje förfrågan som läser eller ändrar data måste kontrolleras på servern mot användarens roll och ägandet av posten.
Ska jag använda radnivåsäkerhet i Postgres?
Radnivåsäkerhet (row-level security) låter databasen själv avgöra vilka rader varje användare får läsa eller skriva, vilket är ett starkt skyddsnät, särskilt när gränssnittet pratar direkt med databasen. Det tillför komplexitet, så många appar tillämpar behörigheter i serverkod och använder radnivåsäkerhet som ett extra lager för känsliga tabeller.