Aperçu
Agatabo utilise le contrôle d’accès basé sur les rôles (RBAC) pour gérer qui peut effectuer quelles actions. Les autorisations sont accordées via des rôles, qui sont assignés aux utilisateurs de l’organisation.Fonctionnalités clés :
- Les rôles sont propres à chaque organisation (chaque organisation définit ses propres rôles)
- Les utilisateurs peuvent avoir plusieurs rôles simultanément
- Les autorisations sont cumulatives (union de tous les rôles assignés)
- La portée ANY prend le dessus sur la portée SELF lorsque la même autorisation est accordée plusieurs fois
Concepts Clés
Autorisations
Une autorisation est la capacité d’effectuer une action spécifique sur une ressource. Format :resource:action
Exemples :
savings:write- Enregistrer des dépôts et retraitsloans:read- Voir les détails des prêtsexpenses:write- Enregistrer des dépensesaudit_logs:read- Voir la piste d’audit
Portées
Chaque autorisation a une portée qui détermine quelles données vous pouvez accéder :
Fonctionnement des portées :
savings:readavec portée SELF : Peut seulement voir son propre solde d’épargnesavings:readavec portée ANY : Peut voir les soldes d’épargne de tous les membresloans:writeavec portée SELF : Peut seulement demander des prêts pour soi-mêmeloans:writeavec portée ANY : Peut créer des prêts pour tout membre
- Si un utilisateur a la même autorisation avec différentes portées (via plusieurs rôles), la portée ANY prend le dessus
- Exemple : Utilisateur avec
savings:readSELF via rôle “Membre” +savings:readANY via rôle “Trésorier” = l’utilisateur obtient l’accès ANY
Rôles
Un rôle est un ensemble d’autorisations assigné à un utilisateur. Les rôles sont propres à l’organisation :- Chaque organisation définit ses propres rôles
- Les noms de rôles et autorisations sont configurés par les administrateurs
- Aucun rôle global/prédéfini dans le système
- admin : Rôle protégé, ne peut pas être assigné/retiré directement (utiliser l’endpoint set-admin)
- member : Lorsqu’il est assigné, crée automatiquement un compte d’épargne du grand livre pour l’utilisateur
key: Identifiant unique (ex. “treasurer”, “loan-officer”)name: Nom d’affichage (ex. “Treasurer”, “Loan Officer”)description: Description optionnelle de l’objectif du rôleisProtected: Si true, le rôle ne peut pas être suppriméisEditable: Si true, les métadonnées et grants du rôle peuvent être modifiéstagColor: Couleur d’étiquette UI (SLATE, RED, BLUE, GREEN, etc.)
Liste Complète des Autorisations
Utilisateurs de l’Organisation (organization_users) :
organization_users:read- Voir la liste et les détails des membresorganization_users:write- Ajouter, modifier, retirer des membresorganization_user_roles:read- Voir les définitions de rôlesorganization_user_roles:write- Créer, modifier, supprimer les définitions de rôlesorganization_user_roles:assign- Assigner/retirer des rôles aux utilisateurs
savings) :
savings:read- Voir l’historique des dépôts/retraitssavings:write- Enregistrer des dépôts et retraits
loans) :
loans:read- Voir les détails de prêts et échéanciersloans:write- Créer de nouveaux prêts, enregistrer des paiementsloans:modify- Modifier les conditions de prêts existantsloans:approve- Approuver les demandes de prêt
bank_accounts) :
bank_accounts:read- Voir la liste et les soldes des comptes bancairesbank_accounts:write- Créer, mettre à jour, supprimer des comptes bancaires
expenses) :
expenses:read- Voir l’historique des dépensesexpenses:write- Enregistrer et catégoriser les dépenses
assets) :
assets:read- Voir le registre des immobilisationsassets:write- Ajouter, modifier, céder des actifs
reserves) :
reserves:read- Voir les soldes de réservesreserves:write- Allouer aux réserves et libérer des réserves
dividends) :
dividends:read- Voir les bassins et distributions de dividendesdividends:write- Créer des bassins et distribuer des dividendes
ledger) :
ledger:read- Voir les comptes du grand livre, écritures comptables, balance de vérificationledger:write- Publier des écritures comptables manuelles
reports) :
reports:read- Accéder aux rapports financiers (bilan, compte de résultat, etc.)
settings) :
settings:read- Voir les paramètres de l’organisationsettings:write- Modifier les paramètres de l’organisation
periods) :
periods:close- Clôturer les périodes comptables
audit_logs) :
audit_logs:read- Voir la piste d’audit (exige la portée ANY)
Points d’Accès API
Obtenir Mes Autorisations
Récupérer vos propres autorisations :Lister les Définitions de Rôles
Obtenir tous les rôles de l’organisation :organization_user_roles:write
Réponse :
- Métadonnées du rôle (key, name, description, couleurs, statut protégé)
- Tous les grants d’autorisation du rôle
- Nombre d’utilisateurs assignés à ce rôle
Créer une Définition de Rôle
Créer un nouveau rôle :organization_user_roles:assign
Champs du corps de requête :
Réponse :
Mettre à Jour une Définition de Rôle
Mettre à jour les métadonnées du rôle (nom, description, etc.) :organization_user_roles:assign
Validation :
- Le rôle doit exister dans l’organisation
- Le rôle doit avoir
isEditable: true(les rôles protégés ne peuvent pas être modifiés)
Mettre à Jour les Grants du Rôle
Remplacer toutes les autorisations d’un rôle :organization_user_roles:assign
Fonctionnement :
- Supprime TOUS les grants existants de ce rôle
- Crée les nouveaux grants depuis le corps de requête
- Retourne le rôle mis à jour avec les nouveaux grants
Un tableau grants vide retire toutes les autorisations du rôle (autorisé).
Réponse : Objet rôle avec grants mis à jour
Supprimer une Définition de Rôle
Supprimer un rôle :organization_user_roles:assign
Validation :
- Le rôle doit exister dans l’organisation
- Le rôle ne doit PAS être protégé (
isProtected: false)
- Toutes les assignations du rôle sont supprimées (les utilisateurs perdent ce rôle)
- Tous les grants d’autorisation sont supprimés
- La définition de rôle est supprimée
Assigner un Rôle à un Utilisateur
Accorder un rôle à un utilisateur de l’organisation :organization_user_roles:assign
Corps de requête :
Comportement spécial :
- rôle admin : Impossible à assigner directement. Utiliser l’endpoint set-admin à la place.
- rôle member : Crée automatiquement un compte d’épargne du grand livre pour l’utilisateur
Retirer un Rôle d’un Utilisateur
Retirer un rôle d’un utilisateur de l’organisation :organization_user_roles:assign
Validation :
- Impossible de retirer le rôle admin directement (utiliser l’endpoint set-admin)
Mettre à Jour la Date d’Assignation d’un Rôle
Changer la date d’assignation d’un rôle :organization_user_roles:assign
Cas d’utilisation : Antidater l’assignation du rôle pour refléter une date d’effet historique
Réponse : Objet assignation mis à jour
Comment les Autorisations sont Vérifiées
Lorsque vous effectuez une action dans Agatabo :-
Le système vérifie l’authentification :
- Jeton d’accès valide requis
- En-tête x-organization-id requis
-
Le système vérifie que vous avez l’autorisation requise :
- Exemple : enregistrer un dépôt exige
savings:write - L’autorisation est vérifiée contre vos grants effectifs (depuis tous les rôles assignés)
- Exemple : enregistrer un dépôt exige
-
Le système vérifie la portée :
- Si l’endpoint précise
requiredScope: "ANY", vous devez avoir la portée ANY - Si l’endpoint a
scopeParam, le système vérifie que vous accédez à vos propres données (portée SELF) ou autorise toute donnée (ANY)
- Si l’endpoint précise
-
Action autorisée ou refusée :
- ✓ Autorisée : l’action continue
- ✗ Refusée : erreur “Insufficient permissions” ou “Permission scope denied”
userType: "system_admin" accorde automatiquement toutes les autorisations avec portée ANY.
Logique du Permission Guard
Depuis permission.guard.ts :Messages d’Erreur Courants
Exemples de Configurations de Rôles
Ces exemples sont indicatifs. Les rôles réels sont définis par l’organisation.Rôle Administrateur
Autorisations suggérées (toutes avec portée ANY) :organization_users:write- Gérer les membresorganization_user_roles:assign- Assigner les rôlessavings:write- Enregistrer des dépôtsloans:write,loans:modify,loans:approve- Gestion complète des prêtsexpenses:write- Enregistrer des dépensesassets:write- Gérer les actifsreserves:write- Gérer les réservesdividends:write- Distribuer les dividendesbank_accounts:write- Gérer les comptes bancairesledger:write- Publier des écritures comptablessettings:write- Modifier les paramètresperiods:close- Clôturer les périodesaudit_logs:read- Voir les journaux d’activitéreports:read- Accéder aux rapports
Rôle Trésorier
Autorisations suggérées (toutes avec portée ANY) :organization_users:read- Voir les membressavings:write- Enregistrer dépôts/retraitsexpenses:write- Enregistrer des dépensesbank_accounts:read- Voir les comptes bancairesledger:read- Voir le grand livrereports:read- Voir les rapports
Rôle Agent de Crédit
Autorisations suggérées (toutes avec portée ANY) :organization_users:read- Voir les membresloans:write- Créer et gérer les prêtsloans:modify- Modifier les conditions de prêtloans:approve- Approuver les prêtssavings:read- Voir l’épargne (vérifier l’éligibilité)reports:read- Voir les rapports
Rôle Comptable
Autorisations suggérées (toutes avec portée ANY) :savings:read- Voir l’historique des dépôtsloans:read- Voir le portefeuille de prêtsexpenses:read- Voir les dépensesassets:read- Voir le registre des actifsreserves:read- Voir les soldes de réservesdividends:read- Voir l’historique des dividendesbank_accounts:read- Voir les comptes bancairesledger:read- Accès complet au grand livreledger:write- Publier des ajustementsreports:read- Accéder aux rapports
Rôle Membre
Autorisations suggérées (toutes avec portée SELF) :organization_users:read- Voir son propre profilsavings:read- Voir son propre solde d’épargneloans:read- Voir ses propres prêtsledger:read- Voir son propre relevé de compte du grand livre
Bonnes Pratiques
Directives de gestion des autorisations :Principe du moindre privilège :
- ✅ Accorder uniquement les autorisations nécessaires à la fonction
- ✅ Commencer avec des autorisations minimales, ajouter selon le besoin
- ✅ Utiliser la portée SELF pour les rôles destinés aux membres
- ✅ Réserver la portée ANY au personnel avec responsabilités globales
- ✅ Créer des rôles correspondant aux vraies fonctions
- ✅ Utiliser des noms de rôles descriptifs (“Trésorier”, pas “Rôle1”)
- ✅ Documenter l’objectif du rôle dans le champ description
- ✅ Utiliser des étiquettes couleur pour l’organisation visuelle
- ✅ Limiter le nombre de rôles (5-10 typiquement)
- ✅ Assigner les rôles selon les responsabilités de l’utilisateur
- ✅ Les utilisateurs peuvent avoir plusieurs rôles (autorisations cumulatives)
- ✅ Antidater les assignations si nécessaire (champ assignedAt)
- ✅ Examiner les assignations chaque trimestre
- ✅ Révoquer rapidement les rôles lorsque les responsabilités changent
- ✅ Protéger les rôles critiques (isProtected: true)
- ✅ Limiter qui a
organization_user_roles:assign - ✅ Auditer régulièrement les changements de rôles (voir journaux d’audit)
- ✅ Ne pas créer de rôles “super utilisateur” trop permissifs
- ✅ Séparer les responsabilités (comptable ≠ trésorier)
- ✅ Par défaut, utiliser SELF pour les rôles de membres
- ✅ Utiliser ANY pour le personnel opérationnel (trésoriers, agents de crédit)
- ✅ Se rappeler que ANY prend le dessus lorsqu’il est combiné
- ✅ Tester les autorisations après assignation (vérifier l’accès)
- ✅ Documenter la structure des rôles dans les politiques de l’organisation
- ✅ Garder une trace écrite de qui a quels rôles et pourquoi
- ✅ Revoir les définitions de rôles annuellement (retirer les rôles inutilisés)
- ✅ Mettre à jour les grants lorsque de nouvelles fonctionnalités sont ajoutées
- ✅ Former les utilisateurs à leurs autorisations et limites
Dépannage
Q : Je ne vois pas le menu ou le bouton attendu dans l’interface R : Vous n’avez pas l’autorisation requise. Solution :- Identifiez ce que vous essayez de faire
- Vérifiez l’autorisation requise (voir la liste ci-dessus)
- Demandez à l’administrateur d’accorder le rôle approprié
- Déconnectez-vous puis reconnectez-vous (rafraîchit les autorisations)
- Vérifiez que le menu/bouton est maintenant visible
Q : Erreur : “Insufficient permissions” R : Vous n’avez pas du tout l’autorisation requise. Vérifier :
- GET /me/permissions pour voir vos grants actuels
- Identifier l’autorisation manquante
- Demander à l’administrateur d’assigner un rôle avec cette autorisation
Q : Erreur : “Insufficient permission scope” R : Vous avez l’autorisation avec portée SELF, mais l’endpoint exige la portée ANY. Exemple : Voir les journaux d’audit exige
audit_logs:read avec portée ANY.
Solution : Demandez à l’administrateur d’accorder l’autorisation avec portée ANY.
Q : Erreur : “Permission scope denied” R : Vous avez l’autorisation avec portée SELF, mais vous essayez d’accéder aux données de quelqu’un d’autre. Exemple : Vous avez
savings:read avec portée SELF, mais vous avez essayé de voir l’épargne d’un autre membre.
Solutions :
- Accédez uniquement à vos propres données, OU
- Demandez à l’administrateur d’accorder la portée ANY
Q : Je peux voir les données mais pas les modifier R : Vous avez l’autorisation
read mais pas l’autorisation write.
Exemple : Vous pouvez voir les prêts (loans:read) mais pas les créer (besoin de loans:write).
Solution : Demandez l’autorisation write pour cette ressource.
Q : L’administrateur a changé mon rôle mais je ne peux toujours pas accéder à la fonctionnalité R : Les autorisations sont mises en cache dans le jeton d’accès. Essayez :
- Déconnectez-vous complètement
- Reconnectez-vous (rafraîchit le jeton avec les nouvelles autorisations)
- Réessayez l’action
Q : Comment voir mes propres autorisations ? R : Appelez l’endpoint GET /me/permissions :
Q : Puis-je m’assigner des autorisations ? R : Seulement si vous avez l’autorisation
organization_user_roles:assign. Vous ne pouvez pas dépasser vos propres autorisations.
Sécurité : Le système n’empêche pas l’auto-assignation. Les organisations doivent limiter qui a l’autorisation assign.
Q : Que se passe-t-il lorsqu’un utilisateur a plusieurs rôles ? R : Les autorisations sont cumulatives (union de tous les rôles). Exemple :
- Rôle A accorde :
savings:read(SELF),loans:read(SELF) - Rôle B accorde :
savings:read(ANY),expenses:write(ANY) - Grants effectifs :
savings:read(ANY),loans:read(SELF),expenses:write(ANY)
Q : Comment créer un rôle personnalisé ? R : Utilisez les endpoints API de gestion des rôles :
- POST /role-definitions (créer le rôle)
- PUT /role-definitions//grants (ajouter les autorisations)
- POST /organization-users//role-assignments (assigner aux utilisateurs)
Sujets Connexes
Rôles des Membres
Guide de gestion des rôles
Matrice des Autorisations
Référence complète des autorisations
Gestion des Membres
Ajouter et gérer les utilisateurs de l’organisation
Piste d'Audit
Suivre les changements de rôles et d’autorisations