===================================== Authorization — PIP (Information Point) ===================================== Le PIP (Policy Information Point) résout les attributs du sujet, de la ressource et de l'environnement à partir des contextvars, de la base de données, de la requête HTTP et des fournisseurs personnalisés. Module : ``src.module.authorization.infrastructure.pip`` .. module:: src.module.authorization.infrastructure.pip :synopsis: Résolution des attributs pour l'évaluation ABAC Attributs résolus ================= Le PIP construit trois dictionnaires d'attributs : **Attributs du sujet** (``subject_attributes``) .. code-block:: python { "user_id": "550e8400-...", "email": "admin@acme.com", "is_superuser": False, "is_staff": False, "roles": ["admin", "billing"], "department": "finance", "abac_attributes": {"level": 3, "clearance": "secret"}, "membership_status": "active", } **Attributs de la ressource** (``resource_attributes``) .. code-block:: python { "type": "Invoice", "id": "660e8400-...", "owner_id": "770e8400-...", # + attributs custom depuis les fournisseurs } **Attributs de l'environnement** (``environment_attributes``) .. code-block:: python { "tenant_id": "880e8400-...", "tenant_slug": "acme-corp", "tenant_status": "active", "request_time": "2026-03-23T10:15:30Z", "ip_address": "192.168.1.100", "http_method": "GET", "path": "/api/v1/invoices/", } Sources de données ================== 1. **Contextvars** : ``current_tenant_var``, ``current_user_var``, ``current_membership_var`` 2. **Base de données** : TenantMembership (rôles, attributs ABAC, département) 3. **Requête HTTP** : méthode, chemin, IP, headers 4. **Fournisseurs personnalisés** : implémentations de ``AttributeProvider`` Fournisseurs personnalisés =========================== Vous pouvez ajouter des fournisseurs d'attributs personnalisés en implémentant l'interface ``AttributeProvider`` : .. code-block:: python from src.share_kernel.domain.interfaces import AttributeProvider class GeoAttributeProvider(AttributeProvider): \"\"\"Ajoute les attributs géographiques basés sur l'IP.\"\"\" def get_attributes(self, context: dict) -> dict: ip = context.get("ip_address") return { "country": geoip_lookup(ip), "timezone": timezone_lookup(ip), } Les fournisseurs sont automatiquement découverts s'ils sont enregistrés dans le PIP. Utilisation manuelle du PIP ============================ .. code-block:: python from src.module.authorization.infrastructure.pip import resolve_attributes subject_attrs, resource_attrs, env_attrs = resolve_attributes( request=request, resource_type="Invoice", resource_id=invoice.id, ) # Utiliser pour une évaluation ABAC manuelle from src.module.authorization.infrastructure.permissions import evaluate_abac result = evaluate_abac( action="update", resource_type="Invoice", resource_id=str(invoice.id), subject_attributes=subject_attrs, resource_attributes=resource_attrs, environment_attributes=env_attrs, )