Aller au contenu principal
N'doua Adé Kouadio MOLOU
Tous les écrits
Retour d'expérience4 min de lecture

Placer la règle d'autorisation là où elle change

Des rôles dans le jeton, ou des politiques fines dans le serveur d'identité ? Les deux dérives sont réelles. Le critère qui tranche n'est pas doctrinal, c'est un rythme.

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.

NiveauLa question poséeOù elle se décide
Groupeà quelle équipe appartenez-vous ?serveur d'identité, dans le jeton
Menuque voyez-vous ?interface — du confort
Routeoù pouvez-vous entrer ?API
Filtrequelles lignes voyez-vous ?API, avec la base
Actionqu'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.

Sujets

  • Keycloak
  • Spring Boot
  • Autorisation
  • Sécurité
  • Architecture

Ce texte vous a servi ?

Partager

LinkedInWhatsAppX

Parlons de ce que vous voulez construire

Une question, une mission, ou simplement l'envie d'échanger : écrivez-moi.