Skip to Content

Terrain 11 — Rôles & permissions

⏱️ TL;DR — 20 mini-jeux ⭐⭐→⭐⭐⭐ sur le système rôles × capabilities × contextes de Moodle — le plus fin des LMS, et le socle de la sécurité (y compris celle de tes plugins). Tu vas définir des rôles, jouer sur les 4 réglages de permission, comprendre l’héritage de contexte, et vérifier les droits.

💡 Le modèle : une capability = un droit atomique (mod/assign:grade). Un rôle = un jeu de capabilities. Une attribution = rôle + contexte (système/catégorie/cours/module/bloc/utilisateur). Les contextes héritent de haut en bas.


🕹️ Mini-jeu 1 — La liste des rôles ⭐⭐ 🛠️

But : voir les rôles standards. Mission : ouvre Administration → Utilisateurs → Permissions → Définir les rôles.

✅ Solution

Les rôles standards : Gestionnaire, Créateur de cours, Enseignant (editingteacher), Enseignant non-éditeur (teacher), Étudiant, Invité, Utilisateur authentifié. Chacun est éditable (avec prudence). L’archétype de départ.


🕹️ Mini-jeu 2 — Anatomie d’une capability ⭐⭐⭐ 💻

But : lire un droit. Mission : ouvre un rôle et repère une capability comme mod/assign:grade.

✅ Solution

Une capability suit type/composant:action : mod/assign:grade (noter un devoir), moodle/course:manageactivities, block/html:addinstance. Le préfixe = le composant (frankenstyle) qui la déclare. Tes plugins en déclareront (terrain 13).


🕹️ Mini-jeu 3 — Les 4 réglages de permission ⭐⭐⭐ 🛠️

But : comprendre Autoriser/Empêcher/Interdire. Mission : repère les colonnes Non défini / Autoriser / Empêcher / Interdire sur une capability.

✅ Solution

Non défini (hérite) · Autoriser (accorde) · Empêcher (retire, mais surchargeable plus bas) · Interdire (retire définitivement, non surchargeable). Comprendre Empêcher vs Interdire est le point subtil des permissions Moodle.


🕹️ Mini-jeu 4 — Dupliquer un rôle ⭐⭐⭐ 🛠️

But : partir d’un existant. Mission : duplique « Enseignant non-éditeur » en « Tuteur ».

✅ Solution

Définir les rôles → Ajouter un rôle → « Utiliser un rôle existant comme base » (duplication). On repart d’un jeu de capabilities proche puis on ajuste. Bien plus sûr que de partir de zéro. Ne jamais modifier les rôles standards pour un besoin ponctuel.


🕹️ Mini-jeu 5 — Restreindre un rôle custom ⭐⭐⭐ 🛠️

But : appliquer le moindre privilège. Mission : sur « Tuteur », Autorise noter, Empêche modifier le cours.

✅ Solution

On coche mod/assign:grade = Autoriser, et moodle/course:manageactivities = Empêcher. Résultat : un rôle qui note sans éditer. C’est le moindre privilège : donner exactement ce qu’il faut, pas plus.


🕹️ Mini-jeu 6 — Les types de contexte ⭐⭐⭐ 🛠️

But : où un rôle peut s’appliquer. Mission : dans la définition d’un rôle, repère « Types de contexte où ce rôle peut être attribué ».

✅ Solution

Un rôle déclare les contextes où il est attribuable : Système, Catégorie, Cours, Module d’activité, Bloc, Utilisateur. Un rôle « Étudiant » s’attribue au cours ; un « Gestionnaire » aux catégories/système. La portée est bornée dès la définition.


🕹️ Mini-jeu 7 — La hiérarchie de contextes ⭐⭐⭐⭐ 🛠️

But : LE concept d’héritage. Mission : dessine : Système → Catégorie → Cours → Module.

✅ Solution

Système └─ Catégorie └─ Cours └─ Module d'activité (et Blocs, Utilisateurs)

Un rôle/permission attribué haut est hérité en bas. Un enseignant sur une catégorie l’est dans tous ses cours. Comprendre cet arbre = comprendre toute la sécurité Moodle (et coder juste, terrain 16).


🕹️ Mini-jeu 8 — Attribuer un rôle dans un contexte ⭐⭐⭐ 🛠️

But : donner le rôle au bon niveau. Mission : attribue « Tuteur » à un utilisateur dans un cours.

✅ Solution

Cours → Participants (ou « Attribuer les rôles » du contexte) → ajoute l’utilisateur avec le rôle. Le rôle vaut ici et en dessous. Le même utilisateur peut avoir un rôle différent ailleurs (terrain 02, jeu 11).


🕹️ Mini-jeu 9 — Surcharger une permission ⭐⭐⭐⭐ 🛠️

But : ajuster localement sans toucher le rôle. Mission : dans un cours, surcharge une permission des Étudiants (ex. interdire de poster au forum). Étapes :

  1. Contexte (cours/activité) → Permissions → Modifier les permissions.

✅ Solution

Une surcharge (override) change une capability pour un rôle dans ce contexte seulement, sans modifier la définition globale du rôle. C’est la bonne façon d’adapter localement (ex. forum en lecture seule dans un cours). Chirurgical et réversible.


🕹️ Mini-jeu 10 — Vérifier les permissions ⭐⭐⭐ 🛠️

But : simuler « X peut-il faire Y ici ? ». Mission : utilise l’outil Vérifier les permissions sur un utilisateur dans un contexte.

✅ Solution

Contexte → Permissions → Vérifier les permissions : choisis un utilisateur → Moodle liste ce qu’il peut/ne peut pas, capability par capability, en résolvant tout l’héritage. L’outil de diagnostic n°1 des droits. Indispensable pour déboguer un accès.


🕹️ Mini-jeu 11 — Empêcher vs Interdire ⭐⭐⭐⭐ 🛠️

But : la nuance qui piège. Mission : mets une capability à « Empêcher » dans une catégorie, puis « Autoriser » dans un cours enfant — observe.

✅ Solution

Empêcher en haut peut être ré-autorisé plus bas (le cours gagne). Interdire en haut gagne toujours, quel que soit le réglage plus bas. Règle d’or : Interdire > Empêcher/Autoriser. Réserve « Interdire » aux cas vraiment définitifs.


🕹️ Mini-jeu 12 — Les capacités des blocs ⭐⭐⭐ 🛠️

But : droits spécifiques aux blocs. Mission : repère block/xxx:addinstance et myaddinstance.

✅ Solution

Un bloc déclare addinstance (ajouter dans un cours) et myaddinstance (ajouter au tableau de bord). Ces capabilities décident qui peut poser le bloc. Tu en déclareras dans ton bloc (terrain 14). Les blocs ont leur propre contexte.


🕹️ Mini-jeu 13 — Les indicateurs de risque ⭐⭐⭐⭐ 💻

But : repérer les capabilities dangereuses. Mission : dans la définition d’un rôle, repère les icônes de risque (XSS, config, données perso…).

✅ Solution

Chaque capability porte des flags de risque (RISK_XSS, RISK_CONFIG, RISK_PERSONAL, RISK_SPAM, RISK_DATALOSS). Ils signalent qu’accorder ce droit ouvre une surface. À considérer avant d’élargir un rôle. Tes plugins déclarent ces risques dans db/access.php (terrain 13).


🕹️ Mini-jeu 14 — Le rôle « Utilisateur authentifié » ⭐⭐⭐ 🛠️

But : le rôle de base de tous. Mission : ouvre le rôle Utilisateur authentifié et vois ses droits par défaut.

✅ Solution

Tout compte connecté a le rôle Utilisateur authentifié (au contexte système) en plus de ses rôles de cours. Modifier ce rôle affecte tout le monde : à toucher avec une extrême prudence. Idem « Invité ».


🕹️ Mini-jeu 15 — Créer un rôle « Créateur de cours limité » ⭐⭐⭐⭐ 🛠️

But : déléguer une capacité précise. Mission : crée un rôle qui peut créer des cours dans une catégorie, rien d’autre.

✅ Solution

Rôle avec moodle/course:create (et le minimum associé), attribuable au contexte catégorie, attribué à un référent. Il crée des cours dans son département sans autres pouvoirs. Cas typique de délégation par le moindre privilège.


🕹️ Mini-jeu 16 — Purger les caches après changement ⭐⭐⭐ 💻

But : un réflexe. Mission : après avoir modifié un rôle, purge les caches et re-teste.

✅ Solution

Les définitions de rôles/capabilities sont cachées. Après un changement (surtout via code/plugin), purge les caches (terrain 10) pour voir l’effet réel. Sinon tu débogues un état périmé. Idem après un nouveau db/access.php (terrain 13).


🕹️ Mini-jeu 17 — Tester en conditions réelles ⭐⭐⭐ 🛠️

But : vérifier vraiment. Mission : après avoir créé « Tuteur », teste-le via « Se connecter en tant que ».

✅ Solution

« Vérifier les permissions » (jeu 10) donne la théorie ; « Se connecter en tant que » (terrain 02) donne le ressenti réel (menus, boutons présents/absents). Les deux ensemble valident un rôle sans surprise.


🕹️ Mini-jeu 18 — Permissions et sécurité du code ⭐⭐⭐⭐ 💻

But : relier au dev. Mission : explique pourquoi un plugin doit appeler has_capability() même si le menu est caché.

✅ Solution

Cacher un lien ne protège rien : une URL forcée contourne l’UI. Le contrôle serveur has_capability($cap, $context) (ou require_capability) est obligatoire dans chaque page/action de plugin (terrain 16). Le système de permissions n’a de valeur que si le code l’interroge.


🕹️ Mini-jeu 19 — Auditer un rôle ⭐⭐⭐ 🛠️

But : hygiène de sécurité. Mission : audite un rôle : a-t-il des capabilities à risque non nécessaires ?

✅ Solution

Passer en revue les capabilities (surtout à risque) d’un rôle révèle les élargissements dangereux (souvent hérités d’un plugin). Auditer périodiquement, retirer le superflu = moindre privilège appliqué. Surtout après l’ajout de plugins qui créent des rôles.


🕹️ Mini-jeu 20 — Récap permissions ⭐⭐⭐ 🛠️

But : capstone du terrain (et fin du bloc admin). Mission : un rôle « Tuteur » propre (moindre privilège, bon contexte), une surcharge locale dans un cours, vérifié via « Vérifier les permissions » et « Se connecter en tant que », caches purgés.

✅ Solution

Tu maîtrises le modèle rôles × capabilities × contextes — le plus puissant des LMS et le socle de la sécurité. C’est exactement ce que tes plugins devront respecter (db/access.php + has_capability()). Fin du bloc découverte/admin (terrains 01–11). Cap sur le code : environnement de dev (terrain 12).


Terrain suivant : 12 — Environnement de dev.