3 KiB
Isolation multi-groupe
Statut: référence technique
Public: mainteneurs, sysadmin
Dernière révision: 2026-06-01
L'application peut servir plusieurs groupes sous une même instance. Les groupes ne doivent pas avoir de liens d'interdépendance métier.
Principe
Le groupe courant est déterminé par le membre authentifié et le groupe_id dans le jeton. Une requête authentifiée ne doit lire ou modifier que les données de ce groupe.
Isolation physique
Chaque groupe reçoit aussi un schéma PostgreSQL dédié, nommé à partir de son identifiant (grp_<uuid>). Les tables du groupe peuvent être rafraîchies dans ce schéma avec le script:
cd /opt/app/backend
venv/bin/python ../deploy/tenant_schemas.py
La sauvegarde quotidienne rafraîchit ces schémas et produit aussi un pg_dump par schéma. La voie applicative principale continue de filtrer par groupe_id; les schémas dédiés constituent la base de migration vers une exécution par search_path tenant.
Page publique
La page de connexion liste les groupes sous forme de tuiles. Chaque tuile affiche l'horaire et les coordonnées du groupe, puis le formulaire de connexion.
Le groupe de démonstration est toujours disponible sur une installation vanille.
Données de groupe
Doivent être isolés par groupe:
- membres;
- invitations;
- postes;
- affectations;
- candidatures;
- rotations;
- rencontres;
- assemblées;
- présences;
- PV;
- propositions et décisions;
- collectes;
- dépenses;
- opérations bancaires;
- transactions comptables;
- réserves;
- mouvements de réserves;
- destinataires;
- contributions;
- littérature;
- ventes;
- jetons;
- événements;
- rapports;
- journal;
- historique.
Tables sans groupe_id direct
Une table sans groupe_id direct est acceptable seulement si son parent isole strictement le groupe. Exemple: une présence peut être bornée par sa réunion.
Routes
Toute route qui reçoit un ID depuis le client doit:
- charger l'objet;
- vérifier son appartenance au groupe courant;
- refuser si l'objet n'appartient pas au groupe.
Permissions
Les permissions de modules sont calculées depuis les postes du groupe courant. Un poste d'un groupe ne peut pas accorder d'accès dans un autre groupe.
Sysadmin
Sysadmin est transversal pour l'administration technique. Ses actions doivent être limitées aux opérations prévues:
- gérer les groupes;
- réinitialiser un groupe;
- réinitialiser la démonstration;
- impersonifier.
Démonstration
Groupe Démonstration est protégé et toujours placé en bas de la liste. Le bouton Réinit recrée ses données fictives sans toucher aux autres groupes.
Tests à refaire lors de changements multi-groupe
- Créer deux groupes.
- Créer des membres dans chaque groupe.
- Vérifier que les listes de membres ne se croisent pas.
- Vérifier que les postes et permissions ne se croisent pas.
- Vérifier les rencontres, assemblées, finances, rapports et journal par groupe.
- Vérifier que l'impersonification reste dans le groupe du membre ciblé.