Aller au contenu

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


Les modules XOOPS ont besoin de contrôles de permissions flexibles qui permettent :

  1. Permissions au niveau du module - L’utilisateur peut-il accéder à ce module?
  2. Permissions au niveau de l’objet - L’utilisateur peut-il accéder à cet élément spécifique?
  3. Permissions au niveau de l’action - L’utilisateur peut-il effectuer cette action?
  4. Permissions personnalisées - Les modules peuvent-ils définir leurs propres permissions?
  1. Requêtes Complexes - Les vérifications de permissions nécessitent des jointures de base de données
  2. Hiérarchie Limitée - Difficile de créer des groupes de permissions
  3. Mauvaise Mise en Cache - Pas de mise en cache intégrée des permissions
  4. Variations des Modules - Chaque module implémente différemment
  5. Performance - Plusieurs requêtes BD pour les vérifications de permissions

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 :

  1. Permissions Hiérarchiques - Héritage des groupes parents
  2. Accès Basé sur les Rôles - Mapper les permissions aux rôles (admin, modérateur, utilisateur, invité)
  3. Permissions des Objets - Contrôle à grain fin par élément
  4. Mise en Cache - Mettre en cache les permissions pour réduire les requêtes
  5. Permissions Personnalisées - Les modules définissent les leurs
  6. Piste d’Audit - Enregistrer les modifications 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_items

  1. Contrôle Granulaire - Gestion des permissions fine-tuned
  2. Standardisé - Cohérent sur tous les modules
  3. Mis en Cache - Performance améliorée avec la mise en cache
  4. Auditable - Suivre qui a changé quoi
  5. Flexible - Support pour les permissions personnalisées
  6. Scalable - Gère les hiérarchies de permissions complexes
  7. Testable - Facile de tester l’unité
  1. Complexité - Plus de code à gérer
  2. Surcharge de la Base de Données - Plus de tables et de jointures
  3. Invalidation du Cache - Doit effacer le cache sur les modifications
  4. Courbe d’Apprentissage - Les développeurs doivent comprendre le système
  5. Performance - Si le cache n’est pas correctement configuré
RisqueSévéritéAtténuation
Permissions excessivement complexesMoyenneBons défauts, documentation
Cache avec données obsolètesHauteTTL, invalidation intelligente
Régression de performanceMoyenneBenchmark, optimiser les requêtes
Contournement de permissionsHauteAudit de sécurité, tests

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();
}
<?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;
}
}
<?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);
}

  • 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


#xoops #adr #permissions #authorization #rbac #security