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¶
Contextvars :
current_tenant_var,current_user_var,current_membership_varBase de données : TenantMembership (rôles, attributs ABAC, département)
Requête HTTP : méthode, chemin, IP, headers
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,
)