Exercices Django Avancé IsAuthenticatedOrReadOnly
🎉

Bravo!

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
apply_permission autorise
perm = IsAuthenticatedOrReadOnly()
req = {'method': 'GET', 'is_authenticated': False}
r = apply_permission(req, lambda r: {'status': 200, 'data': 'ok'}, perm)
assert r['status'] == 200

+ 0 tests cachés

Indices (3 disponibles)

solution.py