Authorization — ABAC (Vue d’ensemble)¶
Le système ABAC (Attribute-Based Access Control) implémente un moteur d’autorisation complet suivant l’architecture XACML avec 4 composants :
PAP (Policy Administration Point) : gestion des politiques via API
PDP (Policy Decision Point) : évaluation des politiques
PEP (Policy Enforcement Point) : enforcement dans les vues DRF
PIP (Policy Information Point) : résolution des attributs
Architecture ABAC¶
Requête HTTP
│
▼
PEP (ABACPermission)
│
├── 1. Résout l'action DRF → ActionType ABAC
│
├── 2. Appelle PIP pour les attributs
│ ├── Attributs sujet (user, roles, membership)
│ ├── Attributs ressource (type, id, owner)
│ └── Attributs environnement (heure, IP, tenant)
│
├── 3. Appelle PDP pour l'évaluation
│ ├── Charge les politiques actives
│ ├── Évalue les politiques statiques en premier
│ ├── Filtre par resource_type et action
│ ├── Évalue les conditions (JSON/Cedar/Casbin)
│ └── Première politique matchée (par priorité) gagne
│
└── 4. Applique la décision
├── ALLOW → continue vers la vue
├── DENY → AccessDeniedError (403)
└── APPROVAL_REQUIRED → ApprovalRequiredError (202)
Flux d’évaluation détaillé¶
Le PEP intercepte la requête dans
has_permission()Le PIP résout les attributs du sujet, de la ressource et de l’environnement
Le PDP évalue les politiques :
Politiques statiques (superuser_full_access, suspended_deny_all)
Politiques actives triées par priorité (décroissant)
Pour chaque politique, les conditions sont évaluées par le moteur configuré
La première politique qui matche détermine la décision
Si
requires_approval=Truesur la politique matchée, uneApprovalRequiredErrorest levéeL’événement
AccessEvaluatedest émis pour l’audit
Exemple de politique ABAC¶
{
"name": "Finance can read invoices",
"effect": "allow",
"priority": 100,
"actions": ["read", "list"],
"resource_type": "Invoice",
"subject_conditions": {
"operator": "and",
"conditions": [
{"attribute": "roles", "operator": "contains", "value": "finance"},
{"attribute": "status", "operator": "eq", "value": "active"}
]
},
"resource_conditions": {},
"environment_conditions": {}
}