ADR-006 - Système de Permissions des Modules
ADR-006: Système de Permissions des Modules
Section intitulée « ADR-006: Système de Permissions des Modules »Système de permissions hiérarchique à grain fin pour les modules XOOPS permettant un contrôle d’accès granulaire.
Accepté - Implémenté dans XOOPS 2.5.x et étendu dans XOOPS 4.0
Contexte
Section intitulée « Contexte »Déclaration du Problème
Section intitulée « Déclaration du Problème »Les modules XOOPS ont besoin de contrôles de permissions flexibles qui permettent :
- Permissions au niveau du module - L’utilisateur peut-il accéder à ce module?
- Permissions au niveau de l’objet - L’utilisateur peut-il accéder à cet élément spécifique?
- Permissions au niveau de l’action - L’utilisateur peut-il effectuer cette action?
- Permissions personnalisées - Les modules peuvent-ils définir leurs propres permissions?
- Requêtes Complexes - Les vérifications de permissions nécessitent des jointures de base de données
- Hiérarchie Limitée - Difficile de créer des groupes de permissions
- Mauvaise Mise en Cache - Pas de mise en cache intégrée des permissions
- Variations des Modules - Chaque module implémente différemment
- Performance - Plusieurs requêtes BD pour les vérifications de permissions
Décision
Section intitulée « Décision »Mettre en Œuvre un Système de Permissions Hiérarchique
Section intitulée « Mettre en Œuvre un Système de Permissions Hiérarchique »Créez un système de permissions standardisé et mis en cache prenant en charge :
- Permissions Hiérarchiques - Héritage des groupes parents
- Accès Basé sur les Rôles - Mapper les permissions aux rôles (admin, modérateur, utilisateur, invité)
- Permissions des Objets - Contrôle à grain fin par élément
- Mise en Cache - Mettre en cache les permissions pour réduire les requêtes
- Permissions Personnalisées - Les modules définissent les leurs
- Piste d’Audit - Enregistrer les modifications de permissions
Hiérarchie de Permissions
Section intitulée « Hiérarchie de Permissions »Utilisateur └── Groupe 1 (Admin) └── Permission: admin_module └── Permission: edit_all_items └── Permission: delete_all_items └── Groupe 2 (Modérateur) └── Permission: moderate_comments └── Permission: edit_own_items └── Groupe 3 (Utilisateur) └── Permission: view_published_items └── Permission: edit_own_items └── Groupe 4 (Invité) └── Permission: view_published_itemsConséquences
Section intitulée « Conséquences »Effets Positifs
Section intitulée « Effets Positifs »- Contrôle Granulaire - Gestion des permissions fine-tuned
- Standardisé - Cohérent sur tous les modules
- Mis en Cache - Performance améliorée avec la mise en cache
- Auditable - Suivre qui a changé quoi
- Flexible - Support pour les permissions personnalisées
- Scalable - Gère les hiérarchies de permissions complexes
- Testable - Facile de tester l’unité
Effets Négatifs
Section intitulée « Effets Négatifs »- Complexité - Plus de code à gérer
- Surcharge de la Base de Données - Plus de tables et de jointures
- Invalidation du Cache - Doit effacer le cache sur les modifications
- Courbe d’Apprentissage - Les développeurs doivent comprendre le système
- Performance - Si le cache n’est pas correctement configuré
Risques et Atténuations
Section intitulée « Risques et Atténuations »| Risque | Sévérité | Atténuation |
|---|---|---|
| Permissions excessivement complexes | Moyenne | Bons défauts, documentation |
| Cache avec données obsolètes | Haute | TTL, invalidation intelligente |
| Régression de performance | Moyenne | Benchmark, optimiser les requêtes |
| Contournement de permissions | Haute | Audit de sécurité, tests |
Modèles de Conception des Permissions
Section intitulée « Modèles de Conception des Permissions »Modèle 1: Permissions Basées sur le Propriétaire
Section intitulée « Modèle 1: Permissions Basées sur le Propriétaire »<?php// L'utilisateur peut éditer ses propres éléments mais pas ceux d'autres
public function canEdit(User $user): bool{ // Owner can always edit if ($this->isOwner($user)) { return true; }
// Check group permissions for editing others' items return $this->permChecker->hasPermission($user, 'edit_all_items');}
private function isOwner(User $user): bool{ return $this->getVar('user_id') === $user->getId();}Modèle 2: Permissions Basées sur le Statut
Section intitulée « Modèle 2: Permissions Basées sur le Statut »<?php// Différentes permissions selon le statut
public function canView(User $user): bool{ switch ($this->getVar('status')) { case 'published': // Anyone with module permission can view return $this->permChecker->hasPermission($user, 'item_view');
case 'draft': // Only owner or admin can view return $this->isOwner($user) || $this->permChecker->hasPermission($user, 'admin_manage');
case 'archived': // Only admin can view return $this->permChecker->hasPermission($user, 'admin_manage');
default: return false; }}Modèle 3: Permissions Basées sur les Rôles
Section intitulée « Modèle 3: Permissions Basées sur les Rôles »<?php// Vérifier contre des rôles spécifiques
public function hasAdminRole(User $user): bool{ return $user->getGroups()->contains('admin_group');}
public function hasModeratorRole(User $user): bool{ return $user->getGroups()->contains('moderator_group') || $this->hasAdminRole($user);}
public function canModerate(User $user): bool{ return $this->hasModeratorRole($user);}Décisions Connexes
Section intitulée « Décisions Connexes »- ADR-001: Architecture Modulaire - Les modules définissent les permissions
- ADR-004: Système de Sécurité - Fondation pour la sécurité
- ADR-005: Intergiciel - Peut appliquer les permissions
Références
Section intitulée « Références »Modèles de Permissions
Section intitulée « Modèles de Permissions »- RBAC (Contrôle d’Accès Basé sur les Rôles)
- ABAC (Contrôle d’Accès Basé sur les Attributs)
- ACL (Liste de Contrôle d’Accès)
Implémentation
Section intitulée « Implémentation »#xoops #adr #permissions #authorization #rbac #security