Journal d'audit des changements de rôle
Chaque fois qu'un rôle est créé, qu'une permission est basculée, ou qu'un utilisateur est attribué à un rôle ou une unité organisationnelle différents, GCM écrit une ligne dans org_audit_log avec l'acteur, l'action, l'entité affectée et l'horodatage. Le catalogue de rôles est l'une des surfaces les plus sensibles de la plateforme — accorder members.delete à la mauvaise personne peut effacer des années d'historique — donc nous traitons son journal de changements comme une fonctionnalité de premier ordre, pas un outil de debug.

Où le trouver
Ouvrez Paramètres → Journaux de données. La page affiche chaque entrée récente à travers votre espace de travail, avec des filtres pour le type d'action, l'e-mail de l'acteur et la plage de dates. Pour restreindre aux événements liés aux rôles, tapez role dans le filtre Action — vous verrez role.created, role.deleted, role_permission.toggled, user_role.assigned, user_role.revoked, user_unit.assigned et user_unit.revoked. Chaque ligne renvoie à l'utilisateur ou au rôle affecté pour que vous puissiez sauter directement à l'enregistrement source.
TIP
Les Journaux de données nécessitent config.manage. Les administrateurs et tout rôle personnalisé qui accorde cette clé peuvent l'ouvrir ; les Leaders et Viewers ne le peuvent pas. C'est intentionnel — la piste d'audit est la dernière ligne de défense contre une menace interne, donc nous ne voulons pas qu'elle soit visible par les mêmes personnes dont elle enregistre les actions.
Ce qui est journalisé
Chaque écriture touchant les tables RBAC v2 émet une entrée d'audit. La clé d'action vous dit ce qui s'est passé, les colonnes d'entité vous disent qui ou quoi a été affecté, et le JSONB de métadonnées porte le détail avant/après.
| Action | Quand cela se déclenche | Charge utile de métadonnées |
|---|---|---|
role.created | Un nouveau rôle est inséré dans roles_v2 | name, key, description, is_system |
role.deleted | Un rôle personnalisé est retiré | name, key, permissions_count |
role_permission.toggled | Un interrupteur dans la matrice de permissions est basculé | role_id, permission_key, new_state (granted/revoked) |
user_role.assigned | Un rôle est ajouté à un utilisateur | user_id, role_id, role_name |
user_role.revoked | Un rôle est retiré d'un utilisateur | user_id, role_id, role_name |
user_unit.assigned | Un utilisateur est limité à une unité organisationnelle | user_id, org_unit_id, org_unit_name |
user_unit.revoked | Un périmètre est effacé | user_id, org_unit_id, org_unit_name |
user.created | Une nouvelle connexion est provisionnée | user_id, email, initial_roles |
user.suspended | La bascule actif est désactivée | user_id, email |
user.reactivated | La bascule actif est réactivée | user_id, email |
user.password_reset | Un admin force une réinitialisation de mot de passe | user_id, email |
Chaque entrée porte aussi actor_id (l'utilisateur qui a effectué l'action), actor_email (dénormalisé pour une recherche rapide même si l'acteur est supprimé ultérieurement), created_at (UTC, affiché dans le fuseau horaire de votre org dans l'interface), et organization_id (à quel espace de travail appartient le changement).
Comment lire une ligne
La vue par défaut affiche : horodatage, acteur, action, entité. Cliquez sur n'importe quelle ligne pour déployer les métadonnées. La vue déployée est la charge JSONB formatée comme une table clé/valeur — ainsi une entrée role_permission.toggled peut afficher :
role_id: e7c3a... (Worship Leader)
permission_key: events.edit
new_state: grantedCombiné avec l'horodatage et l'e-mail de l'acteur, c'est suffisant pour reconstituer exactement ce qui a changé. Si vous repérez un octroi inattendu, vous pouvez soit le revenir manuellement (ouvrez Rôles et Permissions et rebasculez l'interrupteur) soit contacter l'acteur pour le contexte.
Rétention
Les entrées du journal d'audit sont conservées indéfiniment pendant toute la durée de vie de l'espace de travail. Elles survivent aux suppressions de rôle, aux suppressions d'utilisateur, et même aux suppressions douces d'org — la seule chose qui les purge est une suppression dure d'espace de travail, que notre équipe effectue uniquement sur demande signée.
Cela signifie que votre piste d'audit couvre toute votre histoire avec la plateforme, ce qui compte pour les revues de conformité et la forensique post-incident. Ne vous inquiétez pas de l'encombrement ; la page des journaux de données pagine agressivement et le filtre est rapide.
Journaliser depuis les edge functions
Les opérations sensibles déclenchées par les edge functions — par exemple, un workflow qui auto-attribue des membres à un responsable — émettent aussi des entrées d'audit. La edge function appelle log(ctx, action, entity) depuis _shared/caller-context.ts, qui écrit la ligne avec l'identité de l'appelant, pas du service role. Ainsi même les changements automatisés apparaissent sous l'utilisateur qui a déclenché le workflow, avec un tag de métadonnées indiquant qu'il a été piloté par workflow.
C'est pourquoi vous verrez occasionnellement des entrées system dans la colonne acteur : ce sont les rares nettoyages pilotés par cron (par exemple, expirer un token d'invitation) où aucun acteur humain n'existe. Ceux-là sont clairement marqués.
Investigations courantes
Quelques motifs que nous parcourons avec les clients :
- « Qui a donné à Sarah
members.delete? » — filtrer Action =role_permission.toggled, puis chercher dans la charge utile de métadonnéesmembers.delete. Le résultat montre chaque rôle à qui cette clé a déjà été accordée ou révoquée, qui l'a basculée, et quand. - « Pourquoi John peut-il voir les membres de la Branche Est ? » — filtrer Action =
user_unit.assigned, chercher le user_id de John. La liste montre chaque périmètre déjà attaché à lui avec des horodatages. - « Quelqu'un a-t-il supprimé un rôle ce mois-ci ? » — filtrer Action =
role.deleted, plage de dates = mois en cours. Si la réponse est oui, la charge utile de métadonnées préserve le nom et la clé du rôle pour que vous puissiez le recréer.
Export
Cliquez sur le bouton Exporter en haut à droite des Journaux de données pour télécharger la vue filtrée actuelle en CSV. L'export inclut toutes les colonnes que vous voyez plus le JSONB de métadonnées brut, utile pour la revue forensique dans un tableur ou pour transmettre à un auditeur.
Suite
- Récupérer un utilisateur verrouillé — quand le journal d'audit montre une erreur que vous devez annuler.
- Accorder des permissions — à quoi correspondent les interrupteurs de la matrice.
- Journal d'audit platform admin — le journal équivalent pour les événements d'impersonation exécutés par l'équipe GCM.
