Mayan EDMS implémente un système de contrôle d'accès à quatre niveaux qui combine des permissions globales (via des rôles) et des permissions par objet (via des ACL). Ce guide couvre l'ensemble du système, de la création d'un compte à la configuration d'accès granulaires sur des documents spécifiques.
Utilisateur (User)
└── appartient à ──► Groupe (Group)
└── inclus dans ──► Rôle (Role)
└── possède ──► Permission
| Niveau | Modèle | Rôle |
|---|---|---|
| Utilisateur | auth.User (Django) |
Compte individuel avec identifiants |
| Groupe | auth.Group (Django) |
Regroupement d'utilisateurs |
| Rôle | permissions.Role (Mayan) |
Conteneur de permissions réutilisable |
| Permission | permissions.StoredPermission |
Droit élémentaire sur une fonctionnalité |
Quand Mayan vérifie si un utilisateur a une permission :
user.groups.all()
→ pour chaque groupe : groupe.roles.all()
→ pour chaque rôle : rôle.permissions.all()
→ la permission est-elle présente ? → ACCÈS ACCORDÉ
is_superuser=True)Contourne tous les contrôles de permission. Accès total au système sans avoir besoin de rôles ou de groupes. À réserver à l'administrateur système uniquement.
# Dans le code, tous les checks ressemblent à :
if user.is_superuser or user.is_staff:
return True # Accès immédiat, aucune vérification supplémentaire
is_staff=True)Traité comme un superutilisateur dans les vérifications de permission Mayan. Donne accès à l'interface d'administration Django (/admin/).
Accès déterminé exclusivement par ses groupes, les rôles de ces groupes, et les permissions de ces rôles. Si l'utilisateur n'est dans aucun groupe avec rôle, il n'a accès à rien.
Aucune permission. Redirigé vers la page de connexion.
C'est la distinction la plus importante du système.
S'appliquent à tous les objets du type concerné dans tout le système.
Rôle "Lecteur" avec permission "document.document_view"
→ L'utilisateur peut voir TOUS les documents du système
Cas d'usage : Un employé qui doit accéder à tous les documents de son département.
AccessControlList)S'appliquent à un objet spécifique (un document, un cabinet, un index, etc.).
ACL sur Document #42 : Rôle "Client Dupont" → permission "document.document_view"
→ L'utilisateur ne peut voir QUE le document #42
Cas d'usage : Un client externe qui ne doit accéder qu'à ses propres documents.
L'utilisateur tente d'accéder au Document #42
│
▼
A-t-il la permission globale "document_view" via un rôle ?
│
├── OUI → Accès accordé à TOUS les documents (ACL ignorée)
│
└── NON → Existe-t-il une ACL pour Document #42
accordant "document_view" à l'un de ses rôles ?
│
├── OUI → Accès accordé uniquement à ce document
│
└── NON → Accès refusé
Règle clé : Les ACL ne peuvent pas accorder plus que ce que le rôle ne possède globalement. Elles servent à restreindre l'accès à un sous-ensemble d'objets, pas à étendre les droits.
1. Créer le compte
Administration → Utilisateurs → Créer
| Champ | Description |
|---|---|
Username |
Identifiant unique (obligatoire) |
First name / Last name |
Nom affiché |
Email |
Adresse email |
Is active |
Décocher pour désactiver le compte sans le supprimer |
Is superuser |
À ne cocher que pour les administrateurs système |
Groups |
Groupes initiaux (optionnel, modifiable après) |
Après création, Mayan redirige vers l'écran de définition du mot de passe.
2. Affecter à des groupes
Administration → Utilisateurs → {utilisateur} → Groupes
Utiliser l'interface Add/Remove pour sélectionner les groupes.
3. Vérifier les permissions héritées
Les permissions effectives résultent automatiquement des groupes → rôles → permissions. Aucune action supplémentaire n'est requise si les rôles sont déjà configurés.
BASE="https://mayan.example.com/api/v4"
TOKEN="votre_token_admin"
# 1. Créer l'utilisateur
USER=$(curl -s -X POST $BASE/users/ \
-H "Authorization: Token $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"username": "dupont.marie",
"email": "marie.dupont@example.com",
"first_name": "Marie",
"last_name": "Dupont",
"password": "MotDePasse2026!",
"is_active": true
}')
USER_ID=$(echo $USER | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])")
# 2. Ajouter au groupe
curl -X POST $BASE/groups/3/users/add/ \
-H "Authorization: Token $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"user\": $USER_ID}"
import requests
BASE = "https://mayan.example.com/api/v4"
HEADERS = {"Authorization": "Token votre_token_admin"}
# Créer l'utilisateur
user = requests.post(f"{BASE}/users/", headers=HEADERS, json={
"username": "dupont.marie",
"email": "marie.dupont@example.com",
"first_name": "Marie",
"last_name": "Dupont",
"password": "MotDePasse2026!",
"is_active": True
}).json()
# Ajouter au groupe
requests.post(f"{BASE}/groups/3/users/add/", headers=HEADERS,
json={"user": user["id"]})
Administration → Groupes → Créer
Seul champ requis : name (unique dans le système).
Administration → Groupes → {groupe} → Utilisateurs
Interface Add/Remove pour ajouter ou retirer des utilisateurs.
Deux chemins équivalents :
Administration → Groupes → {groupe} → Rôles (vue du côté groupe)Administration → Rôles → {rôle} → Groupes (vue du côté rôle)# API : ajouter un groupe à un rôle
curl -X POST $BASE/roles/2/groups/add/ \
-H "Authorization: Token $TOKEN" \
-H "Content-Type: application/json" \
-d '{"group": 3}'
Administration → Rôles → Créer
Seul champ requis : label (unique).
Administration → Rôles → {rôle} → Permissions
L'interface présente toutes les permissions disponibles, organisées par namespace (app). Cocher les permissions à accorder.
# API : ajouter une permission à un rôle
curl -X POST $BASE/roles/2/permissions/add/ \
-H "Authorization: Token $TOKEN" \
-H "Content-Type: application/json" \
-d '{"permission": "documents.document_view"}'
# Lister toutes les permissions disponibles
curl -H "Authorization: Token $TOKEN" $BASE/permissions/
| Rôle | Permissions principales |
|---|---|
| Lecteur | document_view, document_file_view, tag_view, cabinet_view |
| Contributeur | Lecteur + document_create, document_file_new, tag_attach, tag_remove |
| Gestionnaire | Contributeur + document_delete, document_trash, cabinet_create, metadata_* |
| Administrateur documents | Gestionnaire + document_type_*, index_template_*, workflow_template_* |
| Administrateur système | Toutes les permissions (ou is_staff=True) |
Contexte :
Étape 1 : Créer un groupe et un rôle dédiés
Groupe : "Clients Dupont SA"
Rôle : "Accès client restreint"
→ Permissions : (aucune permission globale)
→ Groupes : "Clients Dupont SA"
Le rôle n'a aucune permission globale. L'accès sera accordé uniquement via les ACL sur les objets spécifiques.
Étape 2 : Créer les ACL sur les documents concernés
Document → Onglet Permissions → Créer une ACL
Accès client restreintdocument_view, document_file_view, document_printÉtape 3 : Ajouter l'utilisateur au groupe
L'utilisateur client, membre de "Clients Dupont SA", hérite du rôle "Accès client restreint" et ne voit que les documents avec une ACL explicite pour ce rôle.
Via API :
# Créer une ACL sur un document spécifique
curl -X POST "$BASE/objects/documents/document/42/acls/" \
-H "Authorization: Token $TOKEN" \
-H "Content-Type: application/json" \
-d '{"role_id": 5}'
# Récupérer l'ID de l'ACL créée, puis ajouter les permissions
ACL_ID=1
curl -X POST "$BASE/objects/documents/document/42/acls/$ACL_ID/permissions/add/" \
-H "Authorization: Token $TOKEN" \
-H "Content-Type: application/json" \
-d '{"permission": "documents.document_view"}'
# Créer une ACL sur plusieurs documents en lot
doc_ids = [42, 43, 44, 45]
role_id = 5
for doc_id in doc_ids:
# Créer l'ACL
acl = requests.post(
f"{BASE}/objects/documents/document/{doc_id}/acls/",
headers=HEADERS, json={"role_id": role_id}
).json()
# Ajouter la permission de lecture
requests.post(
f"{BASE}/objects/documents/document/{doc_id}/acls/{acl['id']}/permissions/add/",
headers=HEADERS, json={"permission": "documents.document_view"}
)
Administration → Utilisateurs → {utilisateur} → Définir le mot de passe
Ou en lot : Administration → Utilisateurs → (sélection) → Définir le mot de passe
Pour empêcher un utilisateur de changer lui-même son mot de passe :
Administration → Utilisateurs → {utilisateur} → Options → Bloquer le changement de mot de passe
Utile pour les comptes de service ou les comptes dont le mot de passe est géré centralement.
Si activée (AUTHENTICATION_DISABLE_PASSWORD_RESET = False), un lien "Mot de passe oublié ?" est disponible sur la page de connexion. L'utilisateur reçoit un email avec un lien de réinitialisation.
Pour désactiver cette fonctionnalité :
# config.yml
MAYAN_AUTHENTICATION_DISABLE_PASSWORD_RESET: true
curl -X POST $BASE/auth/token/obtain/ \
-H "Content-Type: application/json" \
-d '{"username": "dupont.marie", "password": "MotDePasse2026!"}'
# → {"token": "9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b"}
curl -H "Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b" \
$BASE/documents/
authtoken.Token de DRF)| Permission | Description |
|---|---|
user_management.user_create |
Créer des comptes utilisateurs |
user_management.user_view |
Voir la liste des utilisateurs |
user_management.user_edit |
Modifier les utilisateurs, gérer leurs groupes |
user_management.user_delete |
Supprimer des utilisateurs |
user_management.group_create |
Créer des groupes |
user_management.group_view |
Voir les groupes |
user_management.group_edit |
Modifier les groupes, gérer leurs membres |
user_management.group_delete |
Supprimer des groupes |
| Permission | Description |
|---|---|
permissions.role_create |
Créer des rôles |
permissions.role_view |
Voir les rôles |
permissions.role_edit |
Modifier les rôles, gérer leurs permissions et groupes |
permissions.role_delete |
Supprimer des rôles |
| Permission | Description |
|---|---|
acls.acl_view |
Voir les ACL d'un objet |
acls.acl_edit |
Créer et modifier les ACL d'un objet |
| Permission | Description |
|---|---|
authentication.users_impersonate |
Se connecter en tant qu'un autre utilisateur |
| Méthode | Endpoint | Description |
|---|---|---|
GET |
/api/v4/users/ |
Lister les utilisateurs |
POST |
/api/v4/users/ |
Créer un utilisateur |
GET |
/api/v4/users/current/ |
Utilisateur authentifié courant |
GET |
/api/v4/users/{id}/ |
Détail d'un utilisateur |
PATCH |
/api/v4/users/{id}/ |
Modifier un utilisateur |
DELETE |
/api/v4/users/{id}/ |
Supprimer un utilisateur |
GET |
/api/v4/users/{id}/groups/ |
Groupes de l'utilisateur |
| Méthode | Endpoint | Description |
|---|---|---|
GET |
/api/v4/groups/ |
Lister les groupes |
POST |
/api/v4/groups/ |
Créer un groupe |
GET |
/api/v4/groups/{id}/ |
Détail d'un groupe |
PATCH |
/api/v4/groups/{id}/ |
Modifier un groupe |
DELETE |
/api/v4/groups/{id}/ |
Supprimer un groupe |
GET |
/api/v4/groups/{id}/users/ |
Membres du groupe |
POST |
/api/v4/groups/{id}/users/add/ |
Ajouter un utilisateur au groupe |
POST |
/api/v4/groups/{id}/users/remove/ |
Retirer un utilisateur du groupe |
| Méthode | Endpoint | Description |
|---|---|---|
GET |
/api/v4/roles/ |
Lister les rôles |
POST |
/api/v4/roles/ |
Créer un rôle |
GET |
/api/v4/roles/{id}/ |
Détail d'un rôle |
PATCH |
/api/v4/roles/{id}/ |
Modifier un rôle |
DELETE |
/api/v4/roles/{id}/ |
Supprimer un rôle |
GET |
/api/v4/roles/{id}/groups/ |
Groupes du rôle |
POST |
/api/v4/roles/{id}/groups/add/ |
Ajouter un groupe au rôle |
POST |
/api/v4/roles/{id}/groups/remove/ |
Retirer un groupe du rôle |
GET |
/api/v4/roles/{id}/permissions/ |
Permissions du rôle |
POST |
/api/v4/roles/{id}/permissions/add/ |
Ajouter une permission au rôle |
POST |
/api/v4/roles/{id}/permissions/remove/ |
Retirer une permission du rôle |
GET |
/api/v4/permissions/ |
Lister toutes les permissions disponibles |
| Méthode | Endpoint | Description |
|---|---|---|
GET |
/api/v4/objects/{app}/{model}/{id}/acls/ |
ACL d'un objet |
POST |
/api/v4/objects/{app}/{model}/{id}/acls/ |
Créer une ACL |
DELETE |
/api/v4/objects/{app}/{model}/{id}/acls/{acl_id}/ |
Supprimer une ACL |
POST |
/api/v4/objects/{app}/{model}/{id}/acls/{acl_id}/permissions/add/ |
Ajouter une permission à une ACL |
POST |
/api/v4/objects/{app}/{model}/{id}/acls/{acl_id}/permissions/remove/ |
Retirer une permission d'une ACL |
Exemples de chemins ACL :
/api/v4/objects/documents/document/42/acls//api/v4/objects/cabinets/cabinet/5/acls//api/v4/objects/tags/tag/3/acls/Toutes les opérations de gestion des accès sont tracées dans le journal d'activité.
| Événement | Déclenchement |
|---|---|
user_created |
Création d'un compte |
user_edited |
Modification d'un compte, changement de groupes |
group_created |
Création d'un groupe |
group_edited |
Modification d'un groupe, changement de membres ou de rôles |
role_created |
Création d'un rôle |
role_edited |
Modification d'un rôle, changement de permissions ou de groupes |
acl_created |
Création d'une ACL sur un objet |
acl_edited |
Modification des permissions d'une ACL |
acl_deleted |
Suppression d'une ACL |
user_logged_in |
Connexion réussie |
user_logged_out |
Déconnexion |
user_impersonation_started |
Début d'impersonation |
user_impersonation_ended |
Fin d'impersonation |
| URL | Action |
|---|---|
/accounts/users/ |
Liste |
/accounts/users/create/ |
Créer |
/accounts/users/{id}/edit/ |
Modifier |
/accounts/users/{id}/delete/ |
Supprimer |
/accounts/users/{id}/groups/ |
Gérer les groupes |
/accounts/users/{id}/options/ |
Options (mot de passe) |
/authentication/users/{id}/set_password/ |
Définir le mot de passe |
| URL | Action |
|---|---|
/accounts/groups/ |
Liste |
/accounts/groups/create/ |
Créer |
/accounts/groups/{id}/edit/ |
Modifier |
/accounts/groups/{id}/users/ |
Gérer les membres |
/permissions/groups/{id}/roles/ |
Gérer les rôles |
| URL | Action |
|---|---|
/permissions/roles/ |
Liste |
/permissions/roles/create/ |
Créer |
/permissions/roles/{id}/edit/ |
Modifier |
/permissions/roles/{id}/groups/ |
Gérer les groupes |
/permissions/roles/{id}/permissions/ |
Gérer les permissions |
| Besoin | Action |
|---|---|
| Créer un compte | Administration → Utilisateurs → Créer |
| Donner accès à tout le système | Ajouter à un groupe avec rôle contenant les permissions voulues |
| Donner accès à un seul document | Créer une ACL sur ce document pour le rôle de l'utilisateur |
| Empêcher l'accès sans supprimer | Décocher is_active sur le compte |
| Accès total sans configuration | Cocher is_superuser (à éviter en production) |
| Bloquer le changement de MDP | Options utilisateur → Bloquer le changement |
| Voir les permissions d'un rôle | Administration → Rôles → {rôle} → Permissions |
| Tracer qui a fait quoi | Journal d'activité (événements user/group/role/acl) |
| Impersonner un utilisateur | Permission authentication.users_impersonate requise |