← EP21 Internal Docs Podpora21.cz
ADR · ADR-0003 · v1.0.0

RBAC Capability Foundation

accepted v1.0.0 Authors: david.sorf Created: 2026-04-10 Updated: 2026-04-10
rbac authorization security capability roles
Podpora21 používá Hierarchical RBAC s capability-first modelem: atomické capability (p21.ticket.resolve), dědičnost rolí, per-request DB view cache — místo triviálního přihlášen=může vše.
Related docs:

Kontext

Stávající autorizace (DbAuthorizator) byla triviální: přihlášen = může vše. Pro produkční helpdesk nasazení potřebujeme granulární řízení přístupu — agent nesmí vidět tickety jiného tenantu, admin má jiná práva než agent.

Uvažované varianty:

A) Trivial role check — role=admin/agent/client, statický if/else

B) Hierarchical RBAC s capability-first modelem — atomické capability, scope, dědičnost

C) Policy-based (OPA, Casbin) — flexibilnější, ale výrazně komplexnější pro aktuální scale

Rozhodnutí

✓ Chosen: B — Hierarchical RBAC s capability-first modelem

Capability = atomická schopnost systému (p21.ticket.resolve). Namespace: {app_code}.{module_code}.{action}. Scope: global | tenant. Dědičnost rolí: Observer ← Agent ← Admin ← SystemAdmin.

Důvody výběru B nad alternativami:

1. Varianta A neškáluje — při přidání nového modulu nebo role nutná změna kódu

2. Varianta C (OPA) je over-engineering pro single-tenant helpdesk fáze 1

3. Variant B umožňuje přidávat nové capability bez změny schématu

DbAuthorizator zůstává jako fallback pro legacy kontroly, přechod na checkCapability() je postupný per-presenter.

Implementace

Klíčové soubory:

Použití:

$this->checkCapability('p21.ticket.resolve', $ticketId);
$this->checkCapability('p21.ticket.admin');

V šabloně:

{if $rbacService->hasCapability('p21.rbac.admin')}...

Důsledky

Pozitivní:

Negativní / rizika:

Mitigace:

Changelog

VersionDateAuthorNote
1.0.02026-04-10david.sorf

Migrováno z docs/adr/ADR-001-RBAC-Capability-Foundation.md (původní datum rozhodnutí: 2026-03-28).