Aller au contenu

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_name pour 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 :

  • True si la requête est autorisée,
  • False sinon.

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.