Autorisations SaaS multi‑locataire : organisations, équipes et rôles clarifiés
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é.

Pourquoi les autorisations SaaS deviennent confuses si vite
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.
Carte en langage clair : orgs, équipes, utilisateurs et ressources
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 :
- Organisation (tenant) : le compte client et la frontière dure des données.
- Utilisateur (identité) : une personne avec une connexion.
- Membership (adhésion) : le lien qui dit qu'un utilisateur appartient à une org, plus son ou ses rôles.
- Équipe (optionnel) : un regroupement à l'intérieur d'une org pour le travail quotidien.
- Ressource : tout ce qu'il faut protéger (projets, factures, tickets, clés API).
« 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.
Rôles, permissions et étendues sans jargon
Les autorisations SaaS multi‑locataires restent compréhensibles quand vous séparez trois choses :
- Rôles : une étiquette décrivant la responsabilité.
- Permissions : ce qu'une personne peut faire.
- Étendue (scope) : où elle peut le faire.
RBAC en langage courant
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 :
- Voir (lire)
- Créer
- Modifier
- Supprimer
- Gérer (inviter, paramètres, exporter, et autres actions spéciales)
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 :
- Org‑wide (sur toute l'organisation)
- Équipe seulement
- Éléments propres (own items)
- Assignés (assigned)
Quand la propriété vaut mieux qu'un rôle supplémentaire
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.
Un ensemble de règles simple qui monte à des centaines d'orgs
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 :
- Chaque enregistrement (projet, facture, ticket, clé API) a exactement une organisation d'accueil.
- Un utilisateur ne peut voir que les données des orgs où il est membre actif. S'il n'est pas membre, l'UI et l'API doivent se comporter comme si l'org n'existait pas.
- Les rôles contrôlent les actions (créer, modifier, supprimer, exporter), mais seulement au sein des orgs que l'utilisateur peut déjà voir.
- La propriété est un arbitre. Elle peut accorder des droits supplémentaires à l'intérieur d'une étendue autorisée (modifier votre brouillon, gérer votre propre token API) sans étendre l'accès à d'autres données.
- L'accès admin est une exception étroite et explicite. Définissez ce que « admin » peut faire et gardez les rôles admin peu nombreux.
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.
Étape par étape : concevoir votre modèle d'autorisations sur une page
É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.
1) Écrivez les entrées avant les règles
Gardez les parties volontairement petites :
- Choisissez quatre types d'utilisateur que vous pouvez expliquer : owner, admin, member, viewer.
- Listez 3‑6 ressources que les gens touchent quotidiennement (projets, clients, rapports, facturation).
- Pour chaque ressource, listez 2‑4 actions (voir, créer, modifier, supprimer, inviter, exporter).
- Décidez ce qu'un nouveau membre obtient par défaut (généralement viewer ou member, pas admin).
- Décidez ce que change la « équipe ». Limitez‑la à visibilité, affectation et reporting, pas à des pouvoirs surprises.
2) Mettez les règles dans un tableau simple
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.
Propriété des ressources et règles de partage qui restent sensées
Pour garder les autorisations compréhensibles, décidez qui possède chaque ressource, puis limitez les options de partage.
Modèle de propriété par défaut
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 :
- Org‑owned par défaut : stockez les éléments sous un seul
organization_id. - Étiquetage par équipe pour les workflows : taggez vers une équipe pour le routage, pas pour un contrôle d'accès strict.
- User‑owned pour les éléments personnels : privés sauf partage explicite.
- Niveaux de partage uniquement : Privé (propriétaire), Équipe, Org. Évitez les ACLs par élément au début.
- Séparez « assigné à » de « peut accéder » : l'affectation est une responsabilité, pas une permission.
Partage qui reste simple
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.
Invitations, changements d'adhésion et basculement d'org
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.
Invitations
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 :
- Seuls des rôles spécifiques peuvent inviter (par exemple Owner et Admin). Si vous supportez des leads d'équipe, limitez‑les à inviter dans leur équipe.
- Un inviteur ne peut accorder que des rôles au même niveau ou en dessous de son propre niveau.
- Les invitations expirées ne font rien.
- Si l'email possède déjà un compte, l'acceptation l'attache à l'org. Sinon, l'acceptation crée le compte puis l'attache.
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.
Partir sans perdre la propriété
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).
Basculer d'org en toute sécurité
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.
Erreurs communes et pièges à éviter
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 :
- Un « super admin » qui voit par défaut les données de tous les clients
- Protection uniquement UI (boutons cachés) au lieu de vérifications côté serveur
- Clés API et comptes de service qui contournent les règles d'adhésion
- Rôles définis par titres de poste, pas par actions
- Exceptions qui ne se décrivent pas en une phrase
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).
Vérifications rapides avant de déployer des autorisations
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 :
- Nouveau membre essaie de voir, créer et exporter des données
- Lead d'équipe tente de gérer seulement son équipe, pas toute l'org
- Admin d'org change des rôles puis tente une action sensible (supprimer, exporter)
- Utilisateur retiré garde un onglet ouvert et retente des actions
- Utilisateur invité (non accepté) suit une vieille invitation et tente d'accéder
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 ? »
Exemple : d'une org à des centaines sans refondre
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.
Étape 1 : une org, deux équipes
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.
Étape 2 : rôles stables, étendues prévisibles
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 ? ».
Étape 3 : la propriété facilite les décisions d'édition
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.
Étape 4 : 200 orgs, mêmes règles
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.
Prochaines étapes : implémenter, tester et itérer en sécurité
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 :
- Stocke
org_id(etteam_idsi les équipes s'appliquent) - A une règle de visibilité (privé, équipe, org)
- Enregistre des événements d'audit pour les actions sensibles (invites, changements de rôle, exports)
- Est filtrée par étendue dans chaque requête (pas seulement dans l'UI)
- A des valeurs par défaut prévisibles (qui peut la voir juste après création)
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.
FAQ
Qu’est-ce qu’une organisation dans une application SaaS multi-tenant ?
Une organisation est le compte client et la frontière stricte de ses données. Placez chaque enregistrement protégé dans une organisation, puis vérifiez l’appartenance avant de l’afficher ou de le modifier.
Pourquoi séparer les utilisateurs et les appartenances ?
Un utilisateur est une personne avec un identifiant de connexion. Une appartenance enregistre le rôle de cette personne au sein d’une organisation donnée, afin qu’elle puisse disposer d’accès différents selon les comptes clients.
Quand faut-il créer des équipes ?
Utilisez les équipes pour les regroupements quotidiens, l’acheminement et les rapports au sein d’une organisation. Ne laissez pas une équipe devenir un second système d’autorisations difficile à expliquer.
Quelle est la différence entre un rôle, une autorisation et une portée ?
Les rôles décrivent les responsabilités, les autorisations décrivent les actions et la portée limite les endroits où ces actions s’appliquent. Par exemple, un commercial peut modifier les opportunités dont il est responsable, tandis qu’un responsable peut modifier les opportunités de l’équipe.
Avec combien de rôles un produit SaaS doit-il démarrer ?
Commencez avec un petit ensemble, par exemple Propriétaire, Administrateur, Membre et Lecteur. Ajoutez des portées comme personnel, équipe ou organisation avant d’ajouter un autre rôle.
À qui doivent appartenir les ressources dans l’application ?
Faites en sorte que la plupart des enregistrements métier appartiennent à l’organisation, notamment les projets, factures, tickets et contacts. Réservez la propriété utilisateur aux éléments réellement personnels, comme les brouillons, vues enregistrées et jetons d’API.
Comment le partage des ressources doit-il fonctionner ?
Gardez des niveaux de partage simples : privé, équipe et organisation. Considérez l’attribution comme la responsabilité d’un travail, sans donner automatiquement le droit de voir ou modifier tous les enregistrements associés.
Que doit-il se passer lorsque j’invite quelqu’un ?
Créez l’accès seulement après que la personne invitée a accepté une invitation qui indique l’organisation, le rôle et l’équipe facultative. Autorisez les personnes qui invitent à attribuer seulement des rôles de niveau égal ou inférieur au leur, et faites expirer les invitations non utilisées.
Que se passe-t-il lorsqu’une personne quitte une organisation ?
Supprimez ou désactivez immédiatement l’appartenance, tout en conservant les actions passées de la personne dans l’historique d’audit. Transférez les éléments sensibles appartenant à l’utilisateur avant la suppression, au lieu de deviner à qui les attribuer.
Quelles vérifications chaque demande d’autorisation doit-elle effectuer ?
Résolvez d’abord l’organisation actuelle, puis vérifiez l’appartenance, le rôle et enfin la propriété ou le partage. Appliquez le même ordre à chaque requête API, pas seulement dans l’interface.