Équipe, rôles et permissions
Comment fonctionnent les membres, les invitations et les places d'un espace de travail, les quatre rôles de l'espace de travail et les quatorze permissions de la matrice des rôles de chaque espace, ce que voit chaque compte du seed, et comment la propriété change de main.
Pour le pack Full Stack
Comment fonctionne l'accès
- Un compte est toute personne qui se connecte. Il appartient à un espace de travail par une appartenance avec un seul rôle : Owner (exactement un par espace), Admin, Member ou Billing. Un même compte peut avoir un rôle différent dans chaque espace de travail auquel il appartient.
- Chaque espace de travail garde sa propre matrice de rôles : quel rôle détient lesquelles des quatorze permissions. Le propriétaire les détient toutes et ne peut pas être modifié, et deux d'entre elles,
workspace.deleteetroles.manage, restent au propriétaire quoi que dise la matrice. Un nouvel espace de travail part des valeurs par défaut ci-dessous. - L'API vérifie côté serveur chaque requête d'espace de travail : un compte qui n'en est pas membre reçoit 404, comme si l'espace n'existait pas, et une permission manquante reçoit 403. Un espace de travail suspendu garde toutes les lectures et refuse toutes les écritures.
- Le tableau de bord masque les lignes de la barre latérale et les boutons qu'un rôle n'inclut pas, et une page ouverte par son adresse affiche Access required.
- Un changement du rôle d'un membre ou de la matrice s'applique à la requête suivante de ce membre à l'API. Sa barre latérale et ses boutons suivent la prochaine fois que le tableau de bord lit l'espace de travail, au plus tard à un rechargement.
- Le personnel de la plateforme (Platform admin et Support) forme un ensemble de rôles distinct, valable pour tous les espaces de travail : voir Administration de la plateforme.
Les rôles et comptes du seed
Forma Studio, l'espace de travail du seed, utilise la matrice par défaut. Chaque rôle a un compte du seed qui se connecte au tableau de bord ; le guide d'installation liste leurs identifiants de connexion.
| Rôle | Compte | Permissions | Barre latérale |
|---|---|---|---|
| Propriétaire | owner@northstack.example (Alex Morgan) | Les 14 | Overview, Projects, Team, Roles, Billing, Settings et AI assistant |
| Admin | admin@northstack.example (Sam Carter) | workspace.read, workspace.update, projects.read, projects.write, members.invite, members.remove, keys.manage, audit.read, ai.read, ai.apply | Overview, Projects, Team, Roles (lecture seule), Settings avec les clés d'API, et AI assistant ; pas de Billing |
| Membre | member@northstack.example (Noor Hassan) | workspace.read, projects.read, projects.write, ai.read, ai.apply | Overview, Projects, Team, Roles (lecture seule), Settings (lecture seule pour les détails de l'espace de travail) et AI assistant |
| Facturation | billing@northstack.example (Jordan Ellis) | workspace.read, billing.read, billing.manage | Overview, Team, Roles (lecture seule), Billing et Settings ; ni Projects ni AI assistant |
workspace.readest ce qui ouvre les lignes Team, Roles et Settings : chaque rôle, Billing compris, voit donc la liste des membres, la matrice en lecture seule et les paramètres. Les projets de la vue d'ensemble, son graphique hebdomadaire et les projets demandant de l'attention demandentprojects.read. Son activité récente et la cloche montrent chaque événement à un rôle qui détientprojects.readouaudit.read; un rôle avecbilling.readet aucun des deux (Billing, dans le seed) ne voit que les événements de facturation, et tout autre rôle n'en voit aucun. Le journal d'activité complet et son export demandentaudit.read.- L'e-mail de facturation de l'espace de travail n'est renvoyé qu'à un rôle avec
billing.readoubilling.manage. - Forma Studio a 8 membres (un propriétaire, un admin, cinq membres et un contact de facturation) sur les 10 places de la formule Pro, avec deux invitations en attente et un projet archivé. Le propriétaire est aussi admin d'un second espace de travail, Monogram, qui a son propre propriétaire, sa propre équipe, son invitation et sa clé d'API.
yarn seedn'écrit la matrice d'un espace de travail que s'il n'en a pas : le relancer garde donc les modifications faites sur la page Roles. Changez chaque mot de passe du seed, ou supprimez les comptes d'exemple, avant que le tableau de bord soit accessible depuis Internet.
Chaque permission de l'espace de travail
La page Roles regroupe les permissions sous les libellés ci-dessous. La liste est définie une seule fois, dans back-end/src/modules/workspaces/constants/workspace-permissions.ts, avec les valeurs par défaut dont part chaque nouvel espace de travail.
| Groupe | Permission | Sur la page Roles | Rôles par défaut |
|---|---|---|---|
| Espace de travail | workspace.read | View workspace : l'espace de travail et son équipe | Owner, Admin, Member, Billing |
| Espace de travail | workspace.update | Edit workspace : ses détails et ses interrupteurs de notification | Owner, Admin |
| Espace de travail | workspace.delete | Delete workspace (propriétaire seulement) | Propriétaire |
| Projets | projects.read | Read projects : les projets, tâches et fichiers | Owner, Admin, Member |
| Projets | projects.write | Edit projects : créer, modifier, archiver et restaurer des projets et des tâches, téléverser des fichiers | Owner, Admin, Member |
| Les membres | members.invite | Invite members : envoyer, renvoyer et révoquer des invitations | Owner, Admin |
| Les membres | members.remove | Remove members | Owner, Admin |
| Les membres | roles.manage | Manage roles : changer le rôle d'un membre et la matrice (propriétaire seulement) | Propriétaire |
| Facturation | billing.read | View invoices : la formule et les factures | Owner, Billing |
| Facturation | billing.manage | Manage subscription : la formule, les informations de paiement et l'e-mail de facturation | Owner, Billing |
| Développeur | keys.manage | Manage API keys | Owner, Admin |
| Développeur | audit.read | Read activity log : le lire et l'exporter | Owner, Admin |
| Assistant IA | ai.read | Use the assistant | Owner, Admin, Member |
| Assistant IA | ai.apply | Apply suggestions the assistant makes | Owner, Admin, Member |
Ce que l'assistant peut atteindre
ai.read ouvre l'assistant IA et n'accorde rien d'autre. L'assistant ne se voit proposer que les outils que le rôle du membre autorise, chacun demandant la même permission que sa page : sans billing.read, il ne peut pas lire la formule ni les factures, et sans audit.read, il ne peut pas lire l'activité. Il n'écrit rien de lui-même : appliquer les tâches qu'il propose demande à la fois ai.apply et projects.write, revérifiés quand on appuie sur Add.
La page Team
/en/dashboard/team a deux onglets, Members et Invitations, chacun avec une recherche et un filtre Role. Les membres sont listés propriétaire d'abord, puis par rôle et par date d'arrivée.
| Action | Emplacement | Demande |
|---|---|---|
| Invite member | L'en-tête de la page | members.invite |
| Change role (Admin, Member ou Billing) | Le menu d'actions d'un membre | roles.manage, donc le propriétaire |
| Make owner | Le menu d'actions d'un membre | Le propriétaire, avec son mot de passe |
| Remove from workspace | Le menu d'actions d'un membre | members.remove |
| Resend invitation et Revoke invitation | Le menu d'actions d'une invitation | members.invite |
- La ligne du propriétaire n'a aucune action : la propriété ne change de main que par Make owner.
- Retirer quelqu'un le sort aussitôt de cet espace de travail ; ses projets et ses tâches restent. Personne ne se retire soi-même depuis ce menu, et un admin peut retirer des membres et des contacts de facturation mais pas un autre admin (l'API répond 403).
- Un membre retiré garde son compte et ses autres espaces de travail.
Invitations et places
- Invite a member demande une adresse e-mail et un rôle, et liste ce que ce rôle pourra faire. La personne reçoit par e-mail un lien vers
/en/invitations/<token>valable sept jours ; sansSMTP_HOST, le message, lien compris, est écrit dans le journal de l'API. - La page d'invitation affiche l'espace de travail, le rôle, l'e-mail invité (masqué) et l'expéditeur. Pour accepter, il faut être connecté avec l'e-mail invité : une personne nouvelle crée d'abord un compte avec cet e-mail. Une invitation destinée à un autre e-mail, une invitation expirée ou une invitation révoquée est refusée avec son propre message.
- Chaque formule a un nombre de places : 3 sur Starter, 10 sur Pro et 30 sur Scale. Une invitation en attente n'utilise aucune place ; l'accepter en utilise une. Sans place libre, une nouvelle invitation est refusée (« There is no free seat. Change the plan to invite more people. »), de même que l'acceptation d'une invitation, vérifiée dans la même transaction pour que deux personnes ne puissent pas prendre la dernière place en même temps.
- Resend invitation génère un nouveau lien et une nouvelle expiration de sept jours, une fois par minute au plus et cinq fois par invitation. Revoke invitation fait cesser le lien de fonctionner.
- Inviter quelqu'un qui est déjà membre, ou qui a déjà une invitation en attente, est refusé. Une fois épuisé le délai de grâce (
BILLING_GRACE_DAYS) d'un espace de travail en retard de paiement, les nouvelles invitations sont refusées jusqu'au paiement.
La page Roles
/en/dashboard/roles affiche la matrice de l'espace de travail : une ligne par permission, dans les six groupes ci-dessus, et une colonne par rôle, chaque cellule indiquant Allowed ou Not allowed. La colonne Owner est verrouillée, et les lignes Delete workspace et Manage roles indiquent Owner only.
- Seul le propriétaire la modifie. Tous les autres qui détiennent
workspace.readla voient en lecture seule : « Only the workspace owner changes what each role can do. » - Save changes montre d'abord ce que chaque rôle gagne et perd, puis enregistre toute la matrice et écrit un événement
roles.updateddans le journal d'activité. Reset revient à la matrice enregistrée. - Les quatre rôles sont fixes : un espace de travail ne peut pas en ajouter un cinquième. Pour donner moins qu'un rôle à quelqu'un, retirez la permission à ce rôle, ce qui la change pour tous ceux qui le détiennent.
Propriété
- Make owner demande le mot de passe du propriétaire, puis fait du membre choisi le propriétaire et de l'ancien propriétaire un admin, en une seule étape. L'opération est écrite dans le journal d'activité sous
ownership.transferred. - Seul le propriétaire supprime l'espace de travail, depuis Settings, avec son nom et son mot de passe.
- Sur la plateforme, un compte qui possède un espace de travail ne peut pas être supprimé tant qu'un autre membre n'en est pas devenu propriétaire.
Les routes derrière ces pages
| Route | Permission |
|---|---|
GET /api/workspaces/:workspaceId/members | workspace.read |
PATCH /api/workspaces/:workspaceId/members/:memberId | roles.manage |
DELETE /api/workspaces/:workspaceId/members/:memberId | members.remove |
POST /api/workspaces/:workspaceId/members/transfer-ownership | le propriétaire |
GET /api/workspaces/:workspaceId/invitations | workspace.read |
POST /api/workspaces/:workspaceId/invitations, POST .../invitations/:id/resend, DELETE .../invitations/:id | members.invite |
GET /api/invitations/:token et POST /api/invitations/:token/accept | aucune pour lire ; connecté avec l'e-mail invité pour accepter |
GET /api/workspaces/:workspaceId/roles | workspace.read |
PUT /api/workspaces/:workspaceId/roles | le propriétaire (roles.manage) |
:workspaceId est l'identifiant public de l'espace de travail, comme org_forma. Les erreurs reviennent sous forme de codes : seat_limit_reached, already_member, already_invited, resend_too_soon, resend_limit_reached, owner_protected, workspace_owner_only et invalid_password entre autres.
Comment sont construites les vérifications de permissions
Inclus avec votre achat. Connectez-vous pour le lire, ou ouvrez-le dans votre téléchargement.
Où l'API et le tableau de bord vérifient une permission d'espace de travail, et comment en ajouter une.