Sécurité
Trois couches d'autorisation, soft-delete par défaut, audit log automatique : sécurisé sans rien à coder.
Le modèle à trois couches
- Feature flag (
OrganizationFeature) — kill-switch module-level. Aucune ressource du module n'est servie si l'organisation ne l'a pas activé. - Permission ACL (
PermissionCodes) — autorisation fine, par rôle et par utilisateur, posée via#[IsGranted(...)]sur chaque méthode mutante, y compris lesbulk-*. - Voter — propriété et scope d'organisation,
denyAccessUnlessGranted(Voter::ATTR, $entity)avant chaque mutation entité-par-entité.
Les trois couches sont obligatoires, dans cet ordre. Aucune route n'est mergée si l'une manque.
Soft-delete par défaut
Toutes les entités métier portent SoftDeletableTrait. Une suppression pose deleted_at, le filtre Doctrine soft_delete masque automatiquement les lignes, et un super-admin peut restaurer via une route gardée par ROLE_SUPER_ADMIN. Aucune perte de données silencieuse.
Audit log automatique
L'attribut #[Auditable] sur une entité génère un journal complet (création, mise à jour, suppression, restauration), enrichi de l'acteur et des champs modifiés. Pratique pour la conformité, indispensable pour le diagnostic.
JWT + scoping tenant
L'API utilise des tokens JWT signés. L'en-tête X-ORGANIZATION attribue chaque appel à un tenant, validé par CrossOrgGuard avant tout traitement. Cross-org n'est jamais possible, même par mass-assignment.