Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

Operationen mit dem security-Attribut absichern

Operationen mit dem security-Attribut absichern

~14 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026

Die access_control-Regel aus Kapitel 49 sichert PAUSCHAL den GESAMTEN /api-Bereich – das security-Attribut auf einer Operation erlaubt FEINGRANULARERE, ressourcenspezifische Regeln.

Eine Operation auf eine Rolle beschränken

api/src/Entity/Project.php
use ApiPlatform\Metadata\Delete;

#[ApiResource(
    operations: [
        new GetCollection(),
        new Get(),
        new Post(),
        new Put(),
        new Patch(),
        new Delete(security: "is_granted('ROLE_ADMIN')"),
    ],
    // ...
)]

security nimmt einen SYMFONY-EXPRESSION-LANGUAGE-Ausdruck entgegen – is_granted('ROLE_ADMIN') prüft GENAU dieselbe Rolle wie #[IsGranted] in einem klassischen Symfony-Controller.

Das Verhalten testen

curl -k -i -X DELETE https://localhost/api/projects/1 \
  -H "Authorization: Bearer $TOKEN"
HTTP/2 403

{
  "hydra:description": "Access Denied."
}

Status 403 Forbidden – WICHTIG: NICHT 401. Der Token IST gültig (die Identität ist BEKANNT), aber die ROLLE reicht NICHT aus. 401 bedeutet "wer bist du?", 403 bedeutet "ich weiß, wer du bist, aber das darfst du NICHT".

security auf der gesamten Resource

#[ApiResource(
    security: "is_granted('IS_AUTHENTICATED_FULLY')",
    operations: [ /* ... */ ]
)]

security auf RESOURCE-Ebene gilt für ALLE Operationen GLEICHERMASSEN, ZUSÄTZLICH zu ETWAIGEN operation-spezifischen Regeln – BEIDE müssen ERFÜLLT sein.

securityMessage für eigene Fehlermeldungen

new Delete(
    security: "is_granted('ROLE_ADMIN')",
    securityMessage: 'Nur Administratoren dürfen Projekte löschen.',
),

GENAU wie notInRangeMessage bei Constraints (Kapitel 21) ERSETZT securityMessage die generische "Access Denied"-Meldung durch eine SPRECHENDERE, eigene Formulierung.

Tipp: object steht in security-Ausdrücken für die BETROFFENE Entity zur Verfügung, z. B. is_granted('ROLE_ADMIN') or object.getOwner() == user – Kapitel 52 vertieft diesen Ansatz MIT einem eigenen Voter statt einem INLINE-Ausdruck.