Intermédiaire
🧠 Fondamentaux
20 XP
0 personnes ont réussi
IsAuthenticatedOrReadOnly
Pense a un blog comme Medium ou Dev.to : tout le monde peut lire les articles, mais il faut etre connecte pour en publier un. C'est exactement ce que fait la permission IsAuthenticatedOrReadOnly, probablement la plus utilisee en production.
Le principe repose sur la distinction entre methodes HTTP "safe" (qui ne modifient rien : GET, HEAD, OPTIONS) et les methodes d'ecriture (POST, PUT, PATCH, DELETE). Les premieres sont autorisees pour tous, les secondes uniquement pour les utilisateurs connectes.
Tu vas créer la classe IsAuthenticatedOrReadOnly avec une méthode has_permission(request) qui : - Autorise toujours les méthodes safe (GET, HEAD, OPTIONS) - Pour les autres méthodes, vérifie que l'utilisateur est authentifie
Tu vas aussi créer une fonction apply_permission(request, view_func, permission) qui : - Vérifie la permission - Si accordee, appelle view_func(request) et retourne son résultat - Si refusee, retourne {'status': 403, 'error': 'Permission refusee'}
Exemple :
perm = IsAuthenticatedOrReadOnly()
perm.has_permission({'method': 'GET', 'is_authenticated': False}) renvoie True (lecture autorisee pour tous)
perm.has_permission({'method': 'POST', 'is_authenticated': False}) renvoie False (écriture interdite sans auth)
Tests (4/5)
GET autorise sans auth
p = IsAuthenticatedOrReadOnly()
assert p.has_permission({'method': 'GET', 'is_authenticated': False}) == True
POST refuse sans auth
p = IsAuthenticatedOrReadOnly()
assert p.has_permission({'method': 'POST', 'is_authenticated': False}) == False
POST autorise avec auth
p = IsAuthenticatedOrReadOnly()
assert p.has_permission({'method': 'POST', 'is_authenticated': True}) == True