Aller au contenu

ADR-014 : Emplacement du contrat RBAC Forge

Statut

Accepté, Forge 1.x (ticket RBAC-CONTRACT-001-DEFINE-SEPARATE-RBAC-CONTRACT).


Date

2026-05-19


Contexte

Le ticket ENTITY-SCHEMA-RBAC-001 a conclu que rbac ne doit pas être intégré dans
entity.schema.json. La raison : le schéma d'entité canonique doit rester centré
sur la structure de données (champs, types, index, options). RBAC relève de la
sécurité applicative, non du modèle de données.

Le format interne de génération (validation.py) accepte déjà rbac comme
attribut de définition d'entité, permettant à make:crud de générer des guards
@require_permission dans les contrôleurs et {% if can() %} dans les templates.
Cette intégration fonctionne et est testée (56 tests passent), mais via le format
interne uniquement, pas via le format canonique.

La question ouverte après ENTITY-SCHEMA-RBAC-001 : où doit vivre la configuration
RBAC dans un projet Forge ?


Problème

  1. La configuration RBAC dispersée entité par entité (clé rbac dans chaque fichier
    d'entité) couple la définition du modèle de données et les règles d'autorisation.

  2. entity.schema.json utilise additionalProperties: false, il ne peut pas
    accueillir rbac sans modification délibérée.

  3. Le module forge-mvc-rbac est opt-in. Coupler sa configuration au schéma d'entité
    de base obligerait tous les projets Forge à connaître la structure RBAC même sans
    installer le module.

  4. Un contrat RBAC doit couvrir des notions absentes du schéma d'entité : rôles,
    politiques multi-entités, héritages de permissions.


Décision

Le RBAC ne sera pas intégré dans entity.schema.json.

La configuration RBAC vivra dans un fichier séparé : mvc/security/rbac.json.

Ce fichier est distinct du répertoire mvc/entities/. Il appartient à la zone
de sécurité applicative du projet, aux côtés des autres fichiers de configuration
de sécurité.


Format recommandé

Fichier : mvc/security/rbac.json

{
  "schema_version": "1.0",
  "entities": {
    "Article": {
      "permissions": {
        "list":   "article.list",
        "show":   "article.show",
        "create": "article.create",
        "update": "article.update",
        "delete": "article.delete"
      }
    }
  },
  "roles": {
    "admin": [
      "article.list",
      "article.show",
      "article.create",
      "article.update",
      "article.delete"
    ],
    "editor": [
      "article.list",
      "article.show",
      "article.create",
      "article.update"
    ],
    "reader": [
      "article.list",
      "article.show"
    ]
  }
}

Ce format est documentaire uniquement dans ce ticket. Il n'est pas encore
validé par un JSON Schema ni lu par le runtime Forge.


Justification du choix mvc/security/rbac.json

Critère Raison
Centralisation Un seul fichier contient toutes les règles d'accès du projet
Découplage entity.schema.json reste strict sur la structure de données
Modules opt-in Un projet sans forge-mvc-rbac peut ignorer ce fichier
Vision multi-entités Les rôles peuvent couvrir plusieurs entités dans un seul endroit
Cohérence mvc/security/ regroupe déjà les préoccupations de sécurité

Conséquences

  • entity.schema.json reste inchangé (additionalProperties: false, pas de rbac).
  • Le format interne de génération (validation.py) continue d'accepter rbac dans
    les définitions d'entités, il reste un détail d'implémentation du pipeline CLI.
  • make:crud continue de lire rbac depuis la définition interne, sans changement.
  • Aucun runtime n'est modifié dans ce ticket.
  • Le fichier mvc/security/rbac.json n'est pas encore créé ni lu, c'est la
    décision d'architecture, pas l'implémentation.

Hors périmètre de cet ADR

  • Créer un JSON Schema pour mvc/security/rbac.json.
  • Lire mvc/security/rbac.json dans make:crud ou build:model.
  • Modifier les starters pour inclure mvc/security/rbac.json.
  • Publier une nouvelle version de forge-mvc-rbac.

Tickets futurs

Ticket Objectif
RBAC-CONTRACT-002 Créer schemas/rbac.schema.json et valider mvc/security/rbac.json
RBAC-CONTRACT-003 Lire mvc/security/rbac.json dans make:crud pour générer les guards
RBAC-CONTRACT-004 Ajouter un starter de sécurité avec mvc/security/rbac.json

Référence

  • Audit ENTITY-SCHEMA-RBAC-001 : docs/history/audits/entity-schema-rbac-decision-001.md
  • Module RBAC : packages/forge-mvc-rbac/
  • ADR-004 Périmètre core : docs/adr/004-core-perimeter.md
  • ADR-012 Suppression format legacy : docs/adr/012-legacy-format-deprecation-policy.md