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

Attributs résolus

Le PIP construit trois dictionnaires d’attributs :

Attributs du sujet (subject_attributes)

{
    "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)

{
    "type": "Invoice",
    "id": "660e8400-...",
    "owner_id": "770e8400-...",
    # + attributs custom depuis les fournisseurs
}

Attributs de l’environnement (environment_attributes)

{
    "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 :

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

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,
)