RBAC-Autorisierung
Regeln
- Berechtigungen auf JEDER Route mit Middleware prüfen — Autorisierung niemals optional machen
- Standardmäßig verweigern: Wenn keine explizite Berechtigung erteilt wurde, wird der Zugriff verweigert
- Serverseitige Durchsetzung: Das Ausblenden von UI-Elementen ist KEINE Sicherheit — auf dem Server prüfen
- Rollenhierarchie definieren: admin > editor > viewer — höhere Rollen erben niedrigere Berechtigungen
- Ressourcenbasierte Prüfungen: Überprüfen Sie
can(user, "edit", resource) — nicht nur rollenbasierte Zugriffe
- Alle Berechtigungsprüfungen auditieren — protokollieren, wer wann auf was zugegriffen hat, insbesondere bei Admin-Aktionen
- Authentifizierung (Wer bist du?) von Autorisierung (Was darfst du tun?) trennen
type Action = "read" | "create" | "update" | "delete";
type Resource = { ownerId: string; [key: string]: any };
function can(user: { id: string; role: string }, action: Action, resource?: Resource): boolean {
const permissions: Record<string, Action[]> = {
admin: ["read", "create", "update", "delete"],
editor: ["read", "create", "update"],
viewer: ["read"],
};
const allowed = permissions[user.role];
if (!allowed?.includes(action)) return false;
if (resource && action !== "read" && user.role !== "admin") {
return resource.ownerId === user.id;
}
return true;
}
function requirePermission(action: Action) {
return (req, res, next) => {
if (!req.user) return res.status(401).json({ error: "Nicht authentifiziert" });
if (!can(req.user, action, req.resource)) {
return res.status(403).json({ error: "Verboten" });
}
next();
};
}
app.put("/api/posts/:id", loadResource, requirePermission("update"), updatePost);
Vermeiden
- Berechtigungen nur in der UI prüfen — Angreifer rufen Ihre API direkt auf
- Zugriff gewähren, solange nicht explizit verweigert — immer standardmäßig verweigern
- Ein einzelnes
isAdmin-Boolean verwenden — Rollen sollten granular und erweiterbar sein
- Ressourcenbasierte Prüfungen vergessen — „Editor" sollte nicht bedeuten „kann den Inhalt aller bearbeiten"
- Autorisierung bei „internen" Endpunkten überspringen — sie werden irgendwann öffentlich