Permissions (RBAC)¶
ikloze utilise un contrôle d'accès basé sur les rôles avec un modèle User → Group → Permission.
Format des codenames¶
Les permissions sont déclarées dans un registre (PermissionRegistry) et synchronisées en base au démarrage de l'application. Le codename suit le format :
Le registre génère deux familles d'actions :
registry.register('forms', 'form', {
auto: ['add', 'view', 'change', 'delete'], // → forms.add_form, forms.view_form, ...
custom: ['publish_form'], // → forms.publish_form
});
auto— les CRUD standardadd | view | change | delete, produisant<module>.<action>_<resource>.custom— actions métier arbitraires, produisant<module>.<action>tel quel.
Permissions d'administration
Les permissions staff/admin se terminent par le suffixe _admin (ex. users.manage_user_admin). Les permissions CRUD génériques (ex. users.view_user) ne le portent pas. Les méthodes d'admin vivent dans un *AdminService dédié, séparé du service orienté utilisateur.
Vérifier un accès¶
On vérifie l'accès via :
Ordre de résolution¶
hasPerm court-circuite dans cet ordre :
- Superutilisateur (
user.isSuperuser) →true. - Propriétaire du workspace (
workspace.ownerId === user.id) →true. - Sinon → union des permissions issues des groupes de l'utilisateur dans le workspace actif, avec des surcharges explicites allow/deny au niveau de l'adhésion (membership). Les deny l'emportent.
Pas de codename joker
Il n'existe aucun codename *. Les court-circuits superutilisateur/propriétaire sont des raccourcis dans le code (hasPerm), pas des lignes en base. N'introduisez jamais de permission joker.
Synchronisation au démarrage¶
Au boot, le service de synchronisation des permissions lit PermissionRegistry.getAll() et réconcilie la table des permissions en base. Ajouter une permission = l'enregistrer dans le registre ; elle est créée en base au prochain démarrage.
Groupes (rôles)¶
Les groupes portent des ensembles de permissions et sont rattachés à un workspace. Un membre reçoit ses permissions via ses groupes, ajustées par les surcharges allow/deny de son adhésion. Voir le module Cœur.
Liens de code¶
domain/permissions/permission.registry.ts— le registre (register/getAll).domain/users/user.model.ts—hasPermet l'ordre de résolution.app/permissions/— service et synchronisation.web/permissions/permissions.controller.ts— exposition HTTP des permissions effectives.