Exercices Django Avancé Permission custom IsAuthorOrReadOnly
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Permission custom IsAuthorOrReadOnly

Imagine Twitter ou chaque utilisateur peut modifier ou supprimer ses propres tweets, mais pas ceux des autres. Les permissions de base ne suffisent plus ici : il faut verifier non seulement que l'utilisateur est connecte, mais qu'il est bien l'auteur de l'objet qu'il veut modifier.

Dans DRF, ca se fait avec les permissions au niveau de l'objet. En plus de has_permission (verification globale), tu ecris has_object_permission(request, obj) qui verifie si l'utilisateur a le droit sur un objet specifique.

La requête a un champ 'user' qui contient le nom de l'utilisateur connecte. L'objet (un article) a un champ 'author' qui contient le nom de son auteur.

Tu vas créer la classe IsAuthorOrReadOnly avec :

has_permission(request) : retourne True pour les méthodes safe (GET, HEAD, OPTIONS), sinon vérifie l'authentification.

has_object_permission(request, obj) : retourne True pour les méthodes safe. Pour les autres méthodes, retourne True seulement si request['user'] est egal a obj['author'].

Tu vas aussi écrire une fonction can_modify(request, article, permission) qui combine les deux vérifications : d'abord has_permission, puis has_object_permission. Retourne True seulement si les deux passent.

Exemple :

perm = IsAuthorOrReadOnly()
article = {'id': 1, 'title': 'Mon post', 'author': 'alice'}

req_alice = {'method': 'PUT', 'user': 'alice', 'is_authenticated': True}
perm.has_object_permission(req_alice, article) renvoie True

req_bob = {'method': 'PUT', 'user': 'bob', 'is_authenticated': True}
perm.has_object_permission(req_bob, article) renvoie False

Tests (4/5)

Auteur peut modifier
perm = IsAuthorOrReadOnly()
article = {'id': 1, 'author': 'alice'}
req = {'method': 'PUT', 'user': 'alice', 'is_authenticated': True}
assert perm.has_object_permission(req, article) == True
Non-auteur ne peut pas modifier
perm = IsAuthorOrReadOnly()
article = {'id': 1, 'author': 'alice'}
req = {'method': 'DELETE', 'user': 'bob', 'is_authenticated': True}
assert perm.has_object_permission(req, article) == False
GET autorise pour tous
perm = IsAuthorOrReadOnly()
article = {'id': 1, 'author': 'alice'}
req = {'method': 'GET', 'user': 'bob', 'is_authenticated': False}
assert perm.has_object_permission(req, article) == True
can_modify combine les deux
perm = IsAuthorOrReadOnly()
article = {'id': 1, 'author': 'alice'}
assert can_modify({'method': 'PUT', 'user': 'alice', 'is_authenticated': True}, article, perm) == True
assert can_modify({'method': 'PUT', 'user': 'bob', 'is_authenticated': True}, article, perm) == False

+ 0 tests cachés

Indices (3 disponibles)

solution.py