Corriger un prix et ouvrir une caisse ne sont pas le même geste. Ils ne concernent pas les mêmes personnes, et l'un des deux touche la trésorerie. Reste à décider où vit cette règle.
Deux réponses, également défendables
Des rôles grossiers dans le jeton, et la règle métier dans le code. Un développeur qui ouvre le projet la lit. Elle se teste sans démarrer le serveur d'identité, elle passe en revue de code, elle vit dans l'historique, elle se déploie avec le reste.
Des politiques d'autorisation fines dans le serveur d'identité. Keycloak sait décrire des ressources, des portées, des politiques et des permissions. Changer un droit ne demande alors aucun déploiement, les droits sont au même endroit que les identités, et un audit se lit sur un seul écran.
Les deux dérives, dont aucune n'est théorique
D'un côté, le rôle se subdivise. ROLE_ADMIN, puis ROLE_ADMIN_MAGASIN, puis ROLE_ADMIN_MAGASIN_PRIX. Le jeton grossit à chaque nuance — et il grossit dans un en-tête HTTP.
Ce n'est pas une inquiétude abstraite. Sur une plateforme dont j'ai raconté ailleurs la migration multi-tenant, le jeton du super administrateur a atteint 21 903 octets une fois le référentiel de droits aligné, huit fois celui d'un utilisateur ordinaire. Les serveurs web acceptent des en-têtes de 4 à 8 ko par défaut ; au-delà, ils répondent 400 Request Header Or Cookie Too Large. Vu de l'extérieur : un seul compte n'arrive plus à se connecter, sans message exploitable, pendant que tous les autres fonctionnent.
De l'autre côté, la règle métier part vivre dans une console d'administration que les développeurs n'ouvrent jamais. Elle sort de l'historique — donc des revues de code, des tests, et de la reproductibilité d'un environnement à l'autre. « Pourquoi ce comptable ne voit plus les avoirs depuis mardi » devient une question dont la réponse n'est nulle part dans le dépôt.
Ce qui décide vraiment : le rythme
Le critère qui m'aide à trancher n'est pas doctrinal. C'est une fréquence : ce droit change-t-il au rythme du métier, ou au rythme du code ?
Un droit qui bouge plus souvent que vous ne déployez n'a rien à faire dans une annotation. Un droit qui n'a pas changé depuis trois ans n'a rien à faire dans une console d'administration, où personne ne le relit et où rien ne le teste.
Le test du possessif
Il existe un indice plus simple encore. Écrivez la règle en français, et cherchez le possessif.
- « Un caissier ouvre une caisse » — pas de possessif : c'est un rôle.
- « Un caissier ouvre sa caisse » — possessif : ce n'est plus un rôle, c'est une donnée. Aucun rôle ne dira jamais laquelle.
Un droit qui dépend d'une ligne se décide devant la ligne, dans l'API, avec la base. Jamais dans un jeton, qui n'est qu'une photographie prise à la connexion.
Cinq niveaux, et un seul dans le jeton
Sur une plateforme de distribution — trois applications devant une même API — les droits ont fini par s'empiler sur cinq niveaux.
| Niveau | La question posée | Où elle se décide |
|---|---|---|
| Groupe | à quelle équipe appartenez-vous ? | serveur d'identité, dans le jeton |
| Menu | que voyez-vous ? | interface — du confort |
| Route | où pouvez-vous entrer ? | API |
| Filtre | quelles lignes voyez-vous ? | API, avec la base |
| Action | qu'avez-vous le droit d'en faire ? | API, avec la base |
Un seul de ces niveaux voyage dans le jeton. Keycloak dit qui vous êtes et à quel groupe vous appartenez ; l'API décide de ce que cela ouvre. Le jeton reste petit, la règle reste relisible, et un droit fin change sans déploiement — puisqu'il est en base.
Ce que cela n'excuse pas
Deux rappels, parce qu'ils tombent toujours dans la même conversation.
Un menu qui masque une action ne protège rien : c'est du confort d'interface. La règle est appliquée par l'API, ou elle n'est pas appliquée.
Et une suite de tests verte ne prouve rien sur les autorisations tant qu'aucun test n'appelle chaque route avec un compte sans droit pour en attendre un 403. Ce test-là est mécanique, il se génère — et son absence ne se voit dans aucun rapport de couverture.
Ce que j'en retiens
Il n'y a pas de bon endroit universel pour une règle d'autorisation. Il y a un rythme de changement, et un endroit qui lui correspond. Se tromper d'endroit ne se paie pas le jour de la mise en production : cela se paie le jour où le droit change.