Explication simple des autorisations SaaS multi‑locataire : organisations, équipes, rôles et règles de propriété, avec checklists et exemples pour évoluer en toute sécurité.

Les problèmes d'autorisations commencent souvent comme de petites gênes. Un ticket arrive : "Je suis admin mais je ne vois pas les factures." Un autre : "Pourquoi mon collègue peut-il modifier les paramètres ?" Les gens cliquent, devinent, et parfois partagent un seul compte « propriétaire » parce que c'est plus rapide que de régler les accès.
Puis les solutions de contournement s'accumulent. Les équipes inventent des rôles comme « Admin 2 » ou « Manager (sans suppression) ». Les ingénieurs ajoutent des vérifications ponctuelles du type « si l'utilisateur est dans Ventes, autoriser l'export » parce que ça corrige le bug du jour. Un mois plus tard, personne ne sait quelles règles sont volontaires et lesquelles sont des accidents.
Ça empire dès que vous ajoutez des clients. Une règle qui allait pour un compte (« les admins peuvent voir toutes les données ») casse quand vous avez des centaines d'organisations aux attentes différentes. Un client veut une séparation stricte entre départements. Un autre veut un espace partagé. Certains veulent qu'un prestataire n'accède qu'à un projet. Si votre modèle n'est pas clair, chaque nouveau client devient une exception.
L'objectif est simple : des règles d'accès prévisibles que vous pouvez expliquer en une minute. Par exemple : « Votre organisation possède les données. Les équipes groupent les personnes. Les rôles définissent les actions. Les ressources appartiennent à une org, parfois à une équipe. Le partage suit quelques valeurs par défaut. » Si vous ne pouvez pas l'expliquer clairement, ce sera difficile à construire, à tester et dangereux à modifier.
Une promesse qui vaut la peine : moins de rôles, propriété plus claire, valeurs par défaut plus sûres. Commencez par un petit ensemble de rôles liés à des tâches réelles, rendez la propriété évidente pour chaque ressource, et partez du principe du moindre accès. Autorisez le partage volontairement, pas par accident.
Si votre appli sert plusieurs clients, obtenez la carte mentale correcte avant d'écrire des règles. La plupart des confusions dans les autorisations multi‑locataires viennent de définitions flottantes, où un même mot signifie des choses différentes selon l'endroit du produit.
Choisissez un sens pour votre périmètre de locataire et tenez‑vous y. Beaucoup de produits utilisent « organisation » comme tenant : toutes les données vivent dans une org, et rien ne traverse cette ligne sauf si vous implémentez explicitement le partage.
Un vocabulaire simple qui reste clair en grandissant :
« Une personne, plusieurs orgs » est normal. Un consultant peut appartenir à trois orgs clientes, avec des rôles différents. C'est pourquoi « utilisateur » et « membership » doivent être séparés. Vos vérifications dépendent généralement du membership, pas de l'utilisateur.
Les équipes sont utiles quand elles reflètent des regroupements réels comme « Support » ou « Finance ». Elles ajoutent du bruit quand elles deviennent un second système d'autorisations. Un test utile : pouvez‑vous expliquer l'équipe en une phrase sans mentionner une règle fonctionnaliste spécifique ?
Exemple : Maria se connecte une fois, puis bascule entre Org A et Org B. Dans Org A elle est en Finance et peut voir les factures. Dans Org B elle est Viewer et ne peut que lire les projets. Même utilisateur, memberships différents, types de ressources cohérents, frontières claires.
Les autorisations SaaS multi‑locataires restent compréhensibles quand vous séparez trois choses :
RBAC (role‑based access control) signifie : vous donnez un rôle à un utilisateur, et ce rôle accorde des actions autorisées. Les noms de rôle doivent décrire une responsabilité, pas un statut. « Billing Admin » est clair. « Power User » crée généralement des débats.
Traitez les permissions comme des verbes et restez cohérent dans tout le produit :
Ajoutez ensuite l'étendue pour que le même verbe s'applique à différents endroits. C'est ainsi que vous évitez de créer 20 rôles légèrement différents.
Étendues communes et lisibles :
Si vous vous surprenez à créer des rôles comme « Éditeur de projet » et « Éditeur de projet (propre) », c'est généralement un problème d'étendue, pas de rôle.
Exemple : dans un CRM, laissez « Sales Rep » créer et modifier des opportunités, mais limitez l'étendue à « éléments propres ». Laissez « Sales Manager » avoir des verbes similaires avec une étendue « équipe » ou « organisation ». Vous obtenez moins de rôles, des règles plus claires et moins de surprises quand quelqu'un change d'équipe.
Un bon défaut est : les rôles accordent des verbes, et la propriété (ou l'affectation) limite où ces verbes s'appliquent.
Si votre modèle marche pour un client mais casse à dix, vous avez probablement mélangé « qui peut voir » avec « qui peut faire » et « qui possède ». Gardez ces notions séparées et le système reste prévisible.
Un ensemble de règles qui scale :
Exemple : Sam appartient à Org A et Org B. Dans Org A, Sam est Member et peut créer et modifier ses propres rapports mais ne peut pas changer la facturation. Dans Org B, Sam est Billing Manager et peut mettre à jour les moyens de paiement et télécharger les factures, mais ne peut toujours pas voir les projets privés sauf si son membership inclut cette zone.
Cela rend la montée en charge ennuyeuse, dans le bon sens. Ajouter une nouvelle org revient à ajouter des memberships et des rôles. Les règles de base restent les mêmes.
Écrivez une page unique qu'un coéquipier peut lire en deux minutes. Si vous pouvez expliquer les autorisations sans ouvrir le code, vous êtes dans une bonne situation.
Gardez les parties volontairement petites :
Utilisez l'étendue pour éviter l'explosion des rôles. Beaucoup de produits n'ont besoin que de trois étendues : own, team, org.
| Rôle | Voir | Modifier | Inviter des utilisateurs | Facturation | Note d'étendue |
|---|---|---|---|---|---|
| Owner | Oui | Oui | Oui | Oui | Org‑wide, peut transférer la propriété |
| Admin | Oui | Oui | Oui | Non/Oui | Org‑wide, pas de changement de propriété |
| Member | Oui | Limité | Non | Non | Own + équipe (là où assigné) |
| Viewer | Oui | Non | Non | Non | Lecture seule dans l'étendue assignée |
Contrôle de sens : montrez cette page à un collègue non technique et demandez « Un membre Support peut‑il modifier un rapport Sales ? » S'il hésite, vos étendues ou votre définition d'équipe ne sont pas claires.
Pour garder les autorisations compréhensibles, décidez qui possède chaque ressource, puis limitez les options de partage.
Faites en sorte que la plupart des ressources soient possédées par l'organisation. Les clients pensent souvent en termes d'entreprise : factures, projets, contacts, tickets et automatisations appartiennent à l'organisation, pas à un individu.
Les équipes restent utiles, mais traitez une équipe comme une étiquette de workflow pour le routage et les valeurs par défaut de visibilité, pas comme une logique de sécurité cachée. Une étiquette d'équipe peut piloter des filtres, tableaux de bord, notifications ou files d'attente, tandis que l'accès vient toujours des rôles et de l'étendue.
Les ressources possédées par un utilisateur doivent être l'exception, réservées aux éléments vraiment personnels : brouillons, notes privées, vues enregistrées, tokens API, ou paramètres personnels. Si un utilisateur part, décidez : supprimer, transférer ou garder privé.
Un petit ensemble de règles de partage qui reste lisible :
organization_id.Quand quelqu'un dit « J'ai besoin d'accès », demandez à quel niveau : privé, équipe ou organisation. Si ça ne rentre pas dans ces trois niveaux, c'est souvent un signe que vos étendues sont floues, pas que vous avez besoin d'un nouveau mode de partage.
Exemple : un ticket de support peut être org‑owned (pour que les managers puissent reporter sur tous les tickets), taggé équipe Support (pour qu'il apparaisse dans la bonne file) et assigné à Jordan (pour la responsabilité). L'affectation ne doit pas empêcher d'autres rôles autorisés de le voir.
Les autorisations cassent souvent lors des « événements personnes » : inviter quelqu'un, le déplacer entre équipes, ou supprimer l'accès. Ces flux décident si votre modèle reste prévisible.
Traitez une invitation comme une demande de création d'un membership, pas comme un accès en soi. L'invite doit indiquer l'org, l'équipe (optionnel) et le rôle qui sera accordé si elle est acceptée.
Gardez les règles strictes :
L'accès temporaire se gère ici aussi. Au lieu d'inventer un rôle « temporaire », autorisez qu'une attribution de rôle ait une date de fin. À expiration, l'accès tombe automatiquement et la piste d'audit reste propre.
Quand quelqu'un quitte une org, ne devinez pas quoi faire de ses ressources. Si votre règle est « les ressources appartiennent à l'organisation », tenez‑y vous. La personne peut rester l'auteur pour l'historique, mais l'org reste propriétaire.
Si vous avez des ressources user‑owned, exigez un transfert avant la suppression pour tout ce qui est sensible (projets, documents, clés API).
Un login peut appartenir à plusieurs orgs, mais l'application doit toujours avoir une « org courante ». Rendre cela évident dans l'UI et scopez chaque action sur cette org.
La désactivation est souvent préférable à la suppression. Elle enlève l'accès maintenant tout en conservant l'audit des actions passées.
La plupart des modèles d'autorisations échouent parce qu'ils croissent plus vite que les règles. Protégez les bases (frontière du tenant, propriété, étendue) et traitez le reste comme du détail.
L'explosion des rôles est le piège classique. Un cas particulier apparaît et vous créez un nouveau rôle au lieu d'une permission ou d'une étendue plus claire. Après quelques mois, personne ne sait ce que signifie « Manager Plus ». Si vous avez souvent besoin d'un cas, faites‑en une permission de première classe. Si c'est rare, gérez‑le par une attribution temporaire avec expiration.
La dérive des permissions est plus silencieuse mais pire. Quelqu'un ajoute « juste une exception » et oublie de mettre à jour la page d'une seule ligne. Un an plus tard, les règles écrites et le système réel divergent. Mettez à jour le modèle d'abord, puis implémentez.
Les équipes comme faux périmètres de sécurité provoquent une confusion permanente. Si les ressources peuvent être partagées entre équipes dans une org, dites‑le clairement. Si ce n'est pas le cas, appliquez‑le dans le code, pas dans le nommage.
Signaux d'alerte à détecter tôt :
Si le support doit aider un client, « donnez‑leur admin global pour une minute » est une fuite de tenant en attente. Préférez un accès explicite et journalisé avec périmètre serré (une org, fenêtre temporelle, actions spécifiques).
Chaque requête doit résoudre l'organisation active d'abord (depuis le sous‑domaine, l'en‑tête, la session ou la route) et rejeter tout ce qui ne correspond pas.
Après le contexte org, gardez les vérifications dans un ordre cohérent : membership d'abord (est‑il dans cette org ?), puis rôle (que peut‑il faire ici ?), puis propriété ou partage (a‑t‑il accès à cet enregistrement ?). Si vous faites les vérifications de propriété avant le membership, vous pouvez divulguer l'existence d'objets.
Exécutez un petit ensemble de tests de bout en bout avec de vrais comptes, pas seulement des tests unitaires :
Ajoutez des événements d'audit basiques pour les actions qui changent le pouvoir ou déplacent des données : changements de rôle, suppressions d'adhésion, exports, suppressions, mises à jour de paramètres. Ça n'a pas besoin d'être parfait le premier jour, mais il faut pouvoir répondre à « qui a fait quoi, quand ? »
Revoyez les valeurs par défaut. Les nouvelles orgs et les nouveaux membres doivent commencer avec le moins d'accès qui leur permet de réussir. Une FAQ interne rapide sur les permissions pour le support et les ventes aide aussi, avec des exemples comme « Un lead d'équipe voit‑il les autres équipes ? » et « Que devient l'accès après suppression ? »
Commencez avec une configuration petite et réelle : un client (une org) avec deux équipes, Sales et Ops. Tout le monde se connecte une fois, puis choisit l'org dont il fait partie. Sales a besoin des fiches clients et des devis. Ops a besoin de la facturation et des paramètres internes.
Gardez les équipes pour le groupement et le workflow, pas comme le principal commutateur d'autorisations. Elles peuvent influencer les valeurs par défaut et le routage, mais ne doivent pas être la seule porte.
Choisissez un petit ensemble de rôles et conservez‑les stables à mesure que les fonctionnalités arrivent : Admin, Member, Viewer. Le rôle répond à « Que pouvez‑vous faire dans cette org ? ». L'étendue répond à « Où pouvez‑vous le faire ? ».
Ajoutez une règle de propriété : chaque ressource a une org et un propriétaire (souvent le créateur). Modifier est autorisé si vous êtes Admin, ou si vous êtes le propriétaire et que votre rôle inclut « modifier ses propres ». La lecture est autorisée si votre rôle inclut « voir » pour ce type de ressource.
Exemple : un membre Sales crée un devis. Un autre membre Sales peut le voir, mais ne peut pas le modifier sauf s'il est partagé avec l'équipe ou réaffecté. Un Viewer Ops peut le voir seulement si vos règles permettent à Ops de voir les ressources Sales.
Quand vous onboardez 200 orgs clientes, réutilisez les mêmes rôles et les mêmes règles de propriété. Vous changez les memberships, pas le modèle.
Les demandes de support comme « Pouvez‑vous donner l'accès à X ? » deviennent une checklist : confirmer l'org et la ressource, vérifier le rôle de l'utilisateur dans cette org, vérifier la propriété et le partage, puis changer le rôle ou partager la ressource. Évitez les exceptions ponctuelles et laissez une note d'audit.
Considérez votre modèle d'une page comme le contrat. N'implémentez que des règles que vous pouvez faire respecter dans chaque appel API et chaque écran UI, sinon les permissions dérivent en « ça dépend ».
Commencez petit : quelques rôles, étendues claires et propriété simple. Quand une nouvelle demande arrive (« Peut‑on ajouter un rôle Editor‑Manager ? »), serrez d'abord la propriété ou l'étendue. Les nouveaux rôles doivent rester rares.
Pour chaque nouvelle ressource que vous ajoutez, gardez les bases cohérentes :
org_id (et team_id si les équipes s'appliquent)Testez les flux réels avant d'optimiser les cas limites : invitations, basculement d'org, pages admin, et ce qui arrive quand quelqu'un perd l'accès en pleine session.
Si vous construisez avec un constructeur d'applications basé sur le chat, il aide d'écrire d'abord le modèle d'autorisations en langage courant et de le garder avec la spécification produit. Sur Koder.ai (koder.ai), Planning Mode plus snapshots et rollback sont un moyen pratique d'essayer ces scénarios et de confirmer que les règles se comportent de la même façon sur web, backend et mobile.