Tmavý režim
Autorizace & Role
Tříúrovňová hierarchie adminů
SuperAdmin (globální)
│ Vidí a spravuje vše — všechny aplikace, uživatele, role
│
└── AppAdmin (per-aplikace)
│ Spravuje role, oprávnění a přiřazení v jedné aplikaci
│
└── User (běžný uživatel)
Může dělat jen to, co mu role + overrides povolíSuperAdmin
- Uložen v tabulce
super_admins(pouze email) - Bypass všech permission checků — má přístup ke všemu
- Výjimka: Deaktivovaný účet (
users.active = false) blokuje i superadmina při permission checku - Spravovat superadminy může jen jiný superadmin
bash
# Přidání superadmina
POST /api/users/superadmins
Authorization: Bearer <superadmin-token>
{ "email": "admin@firma.cz" }
# Seznam superadminů
GET /api/users/superadmins/listAppAdmin
- Uložen v tabulce
app_admins(email + application_id) - Může spravovat pouze svoji aplikaci (role, oprávnění, přiřazení)
- Nemůže přidávat/odebírat jiné adminy — to je výsada superadmina
- Může přidat uživatele a přiřadit mu role ve své aplikaci
bash
# Přidání app admina (vyžaduje superadmin)
POST /api/users/admins/apps/:appCode
Authorization: Bearer <superadmin-token>
{ "email": "appadmin@firma.cz" }
# Seznam adminů aplikace
GET /api/users/admins/apps/:appCodeMiddleware stack
authorizationMiddleware()
Ověří JWT token a nastaví req.token:
typescript
req.token = {
email: "uzivatel@firma.cz",
orgId: "org_abc123", // jen Zitadel
roles: { ... }, // jen Zitadel projekt role
sub: "user_123",
provider: "zitadel"
}Vrátí 401 Unauthorized pokud:
- Chybí
Authorizationheader - Token je neplatný, expirovaný nebo od neznámého providera
loadSuperAdminFlag()
Načte superadmin status do req.isSuperAdmin:
typescript
// Nastaví req.isSuperAdmin = true/false
// Na základě SELECT FROM super_admins WHERE email = req.token.emailMusí být zavolán po authorizationMiddleware().
requireSuperAdmin()
Vrátí 403 Forbidden pokud req.isSuperAdmin !== true.
typescript
// Použití v route
router.post('/superadmins',
authorizationMiddleware(),
loadSuperAdminFlag(),
requireSuperAdmin(),
async (req, res) => { ... }
);requireAppAdmin()
Ověří, že je uživatel admin dané aplikace (nebo superadmin):
typescript
// Kontroluje req.params.appCode
// SELECT FROM app_admins WHERE email = ? AND app = ?
// SuperAdmin projde automatickyVrátí 403 Forbidden pokud uživatel není app admin ani superadmin.
requireInternalApiKey()
Pro service-to-service endpointy — validuje x-internal-api-key header:
typescript
// Porovná s config.internalApiKey
// 401 pokud chybí nebo neodpovídáPřehled autorizace per endpoint
Bez autentizace
GET /api/test,GET /api/version,GET /api/docsPOST /api/check,/check/bulk,/check/effective,/check/cache/clearPOST /api/zitadel/webhook,GET /api/zitadel/login,/callback
JWT (libovolný přihlášený uživatel)
GET /api/profile/me— svůj profilPUT /api/profile/me— úprava svého profiluGET /api/profile/me/admin-status— vlastní admin statusGET/PUT /api/profile/me/apps/:appCode— vlastní preferenceGET/PUT /api/profile/me/push/*— vlastní push subscriptionsGET/PUT /api/profile/me/notifications/*— vlastní notifikační preference
JWT + AppAdmin
GET/POST /api/applications/:appCode/permissionsGET/POST/PUT/DELETE /api/applications/:appCode/rolesGET /api/users— seznam uživatelůPOST /api/users— vytvoření uživateleGET /api/users/:email— detail uživateleGET/PUT /api/users/:email/apps/:appCode/rolesGET/PUT /api/users/:email/apps/:appCode/resources/*GET /api/admin/dashboard/stats— statistiky (jen svá aplikace)
JWT + SuperAdmin
GET/POST/PUT/DELETE /api/applications— správa aplikacíPOST/DELETE /api/users/admins/apps/:appCode/*— správa app adminůGET/POST/DELETE /api/users/superadmins— správa superadminůPATCH /api/users/:email/active— aktivace/deaktivaceGET/POST/PUT/DELETE /api/admin/notifications/*— správa notifikačních typůGET/POST/PUT/DELETE /api/admin/brands/*— správa brandůGET /api/admin/dashboard/stats— statistiky (všechny aplikace)GET/POST/PUT /api/zitadel/admin/*— správa Zitadel organizací
x-internal-api-key (service-to-service)
POST /api/internal/notifications— odeslání notifikacePOST /api/internal/notifications/bulkGET /api/internal/notifications/typesGET /api/internal/notifications/log/:emailGET/POST/PUT/DELETE /api/internal/notifications/templates/*
Diagram chybových odpovědí
| Situace | HTTP kód | Popis |
|---|---|---|
| Chybí nebo neplatný token | 401 | Unauthorized |
| Platný token, nedostatečná práva | 403 | Forbidden |
| Neplatný API klíč | 401 | Unauthorized |
| Zdroj neexistuje | 404 | Not Found |
| Validační chyba body | 422 | Unprocessable Entity |
| Deaktivovaný uživatel | 403 | Forbidden (jen pro admin akce) |
Bezpečnostní poznámky
Deaktivovaný uživatel
Deaktivovaný uživatel (active = false) nemůže provádět admin operace — middleware to kontroluje. Při permission checku (/check) je deaktivovaný uživatel vždy denied, i kdyby byl superadmin.
Rotace klíčů
Interní API klíč (internalApiKey) můžete rotovat bez restartu ostatních služeb — pouze API a klientské backend aplikace musí dostat nový klíč současně.