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é

  1. Le PEP intercepte la requête dans has_permission()

  2. Le PIP résout les attributs du sujet, de la ressource et de l’environnement

  3. Le PDP évalue les politiques :

    1. Politiques statiques (superuser_full_access, suspended_deny_all)

    2. Politiques actives triées par priorité (décroissant)

    3. Pour chaque politique, les conditions sont évaluées par le moteur configuré

    4. La première politique qui matche détermine la décision

  4. Si requires_approval=True sur la politique matchée, une ApprovalRequiredError est levée

  5. L’événement AccessEvaluated est é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": {}
}