Permissions¶
Cette section présente la classe de permission personnalisée utilisée dans l’API pour contrôler l’accès basé sur les clés API et les permissions par table de base de données.
Classe TablePermissionAPIKey¶
Cette classe hérite de BasePermission de Django REST Framework et applique les règles suivantes :
- Autorise toutes les méthodes HTTP sûres (GET, HEAD, OPTIONS) sans authentification.
- Pour les méthodes d’écriture (POST, PUT, PATCH, DELETE), exige une clé API valide avec la permission correspondante sur la table ciblée.
- Vérifie que la clé API est active et non expirée.
- Vérifie que la vue possède un attribut
table_namepour déterminer la table concernée. - Cherche dans les permissions associées à la clé API si la méthode est autorisée sur cette table.
Détail de l’implémentation¶
La méthode clé has_permission(self, request, view) effectue ces contrôles et retourne :
Truesi la requête est autorisée,Falsesinon.
Exemple de code¶
from rest_framework.permissions import BasePermission
class TablePermissionAPIKey(BasePermission):
def has_permission(self, request, view):
if request.method in ['GET', 'HEAD', 'OPTIONS']:
return True
api_key = getattr(request, 'auth', None)
if not api_key or not hasattr(api_key, 'is_valid') or not api_key.is_valid():
return False
table_name = getattr(view, 'table_name', None)
if not table_name:
return False
perm = api_key.permissions.filter(table_name=table_name).first()
if not perm:
return False
method = request.method
if method == 'POST' and perm.can_post:
return True
if method == 'PUT' and perm.can_put:
return True
if method == 'PATCH' and perm.can_patch:
return True
if method == 'DELETE' and perm.can_delete:
return True
return False
Cette approche garantit un contrôle d’accès fin basé sur la clé API et les droits précis sur chaque table, renforçant la sécurité de l’API t404.xyz.