2.9 KiB
2.9 KiB
RBAC Permission Playbook
Letzte Aktualisierung: 2026-02-25
Ziel: Neue Rechte konsistent und ohne Legacy-Pfade ergänzen.
Entscheidungshilfe
- Nur UI an bestehende Ability hängen: 3 Schritte.
- Neue Ability auf bestehende Permission: 4 Schritte.
- Ganz neue Permission (inkl. DB): 7 Schritte.
Fall A: Ganz neue Permission
- Permission-Key in
PermissionServiceergänzen. Datei:lib/Service/Access/PermissionService.php - DB-Update für Bestandsinstanzen anlegen (idempotent).
Datei:
db/updates/YYYY-MM-DD-*.sql db/init/init.sqlfür Neuinstallationen synchron ergänzen.- Ability in passender Policy ergänzen:
ABILITY_*,supports(), Mapping inauthorize(). - Action/API auf Ability umstellen:
Web:
Guard::requireAbility(...)oderAuthorizationService. API:ApiResponse::requireAbility(...). - Falls UI betroffen:
UiCapabilityMapergänzen und in Action nach$viewAuthauflösen. - Tests + Doku aktualisieren.
Beispiel (Core): system_audit.view + system_audit.purge mit Abilities
ops.admin.system_audit.view und ops.admin.system_audit.purge.
Fall B: Neue Ability auf bestehende Permission
- Ability in passender Policy ergänzen und auf vorhandenen Permission-Key mappen.
- Action/API auf neue Ability ziehen.
- Optional UI-Mapping in
UiCapabilityMap+$viewAuth. - Tests/Doku nachziehen.
Fall C: Nur UI-Freigabe erweitern (ohne neue Permission)
- Capability-Key in
UiCapabilityMapergänzen. - In Action mit
UiAccessService::pageCapabilities(...)oderlayoutCapabilities()auflösen. - Template nur über
$viewAuth['page']bzw.$viewAuth['layout']steuern.
Fall D: API-only Endpoint
- Ability festlegen (Policy/OperationsPolicy).
- Endpoint mit
ApiResponse::requireAbility(...)schützen. - OpenAPI aktualisieren.
- API-Tests ergänzen.
Fall E: Scope-sensitive Ability (Ressourcenbezug)
- Immer Kontext übergeben, z. B.:
actor_user_id,target_user_id,target_tenant_id,input. - Wenn Capabilities benötigt werden:
AuthorizationDecision::attribute('capabilities', [])nutzen. - Für reine Bool-Checks
AuthorizationService::allow(...)verwenden.
Verbindliche Regeln
- Keine Permission-Checks in Templates (
can(...)verboten). - Keine alten Wrapper (
Guard::requirePermission*,ApiResponse::requirePermission). - UI nur über
$viewAuth. - Policy-/Ability-Namen sind der technische Vertrag, nicht der Permission-Key im Template.
Minimal-Checkliste vor Merge
rg -n "(?<!::)\\bcan\\(" templates pages -g '*.phtml' -P
rg -n "Guard::requirePermission\\(|Guard::requirePermissionOrForbidden\\(|ApiResponse::requirePermission\\(" pages lib tests web templates -g '*.php'
docker compose exec php vendor/bin/phpunit
docker compose exec php vendor/bin/phpstan analyse -c phpstan.neon --no-progress
Erwartung:
- Die beiden
rg-Checks liefern0Treffer. phpunitundphpstansind grün.