# ADR-007 — Création d'utilisateur réservée à admin et agency

Date : 2026-05-22
Statut : Accepté
Fiche source : registry/T5-edit-cta-roles/DEC-CTA-001-user-creation-agency.md
Sécurité : ⚠️🔒 (escalade de privilèges / multi-tenant)

## Contexte

Avec la refonte des rôles, il fallait décider qui peut créer des utilisateurs,
et empêcher tout détournement (un chef d'agence se créant un compte admin, ou
créant des users dans une autre agence).

## Décision

| Rôle | Créer un user ? | Contraintes |
|---|---|---|
| `admin` | ✅ | tout rôle, choix d'agence |
| `agency` | ✅ | `account_id` forcé au sien ; rôle créé limité à `agent` |
| `support`, `finance`, `sale`, `agent`, `viewer` | ❌ | 403 |

## Conséquences (triple verrou)

- **Backend (sécurité réelle)** : `CrudController::create` → `enforceUserCreationPolicy()`
  quand `modulename==='users'` : 403 si rôle ∉ {admin,agency} ; agency force
  `account_id` au sien et ne peut créer qu'un `agent`. Tests `UserCreationPolicyTest`
  (3, dont 2 sécurité) verts. Implémenté : estair-api `3a85131`.
- **CHAPS** : le CTA `create` du module `users` a `roles=["admin","agency"]`
  (StandardCtasSeeder). chaps-api `cf141fd`.
- **CASL (frontend)** : admin = `manage all` ; agency = `manage User` scopé
  account_uuid ; autres rôles = aucune rule `User`. Bouton créer gated
  `can('create','User')`. frontend `9db80e7`.

## Note

- Le formulaire de création user côté frontend (DEC-USR-001) n'est pas encore
  livré : quand il le sera, le select de rôle devra être verrouillé à `agent`
  pour un role=agency (le verrou backend tient déjà quoi qu'il arrive).

## Références

> Ange : « la création d'un user, c'est uniquement le chef d'agence. Pas Support, pas Finance »
