• 10 heures
  • Difficile

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 28/11/2023

Restreignez l'accès à certains endpoints

Limitez l’accès aux utilisateurs authentifiés

Nous disposons maintenant d’endpoints d’administration qui permettent de gérer pleinement des entités, mais leur accès est pour le moment public. Améliorons cela en imposant aux utilisateurs d’être authentifiés pour pouvoir faire des appels à nos endpoints d’administration. Commençons par l'endpoint d’administration des catégories.

DRF nous permet de gérer l’accès aux endpoints au travers des permissions, et nous propose une permission IsAuthenticated, exactement ce qu’il nous faut !

Les permissions se configurent au niveau des views, au travers de l’attribut de classe permission_classes. Cet attribut est une liste, et permet donc d’appliquer plusieurs permissions. Elles sont parcourues une à une par DRF, et l’accès à la vue n’est permis que si toutes les permissions le permettent.

Mettons en place cette permission sur notre AdminCategoryViewset  :

from rest_framework.permissions import IsAuthenticated
 
class AdminCategoryViewset(MultipleSerializerMixin, ModelViewSet):
 
    serializer_class = CategoryListSerializer
    detail_serializer_class = CategoryDetailSerializer
    # Nous avons simplement à appliquer la permission sur le viewset
    permission_classes = [IsAuthenticated]
 
    def get_queryset(self):
        return Category.objects.all()

L’accès à l'endpoint nécessite à présent d’être authentifié en ajoutant dans les headers de la requête POST la clé Authorization  qui a pour valeur  Bearer ACCESS, où ACCESS  est la valeur du token d’accès.

Appel en succès d’un endpoint sécurisé en précisant l’attribut Authorization dans le header de la requête
Appel en succès d’un endpoint sécurisé en précisant l’attribut Authorization dans le header de la requête

Vous verrez le status code à droite entre les KEY et la console. Ci-dessus, l'accès a été accepté et un status code 200 est retourné. Sans authentification, un status code 401 est retourné, et l’accès est refusé.

Un appel sans disposer d’un JWT valide ou sans en fournir sur un endpoint sécurisé retourne un status code 401
Un appel sans disposer d’un JWT valide ou sans en fournir sur un endpoint sécurisé retourne un status code 401

Voyons la mise en place d'authentification dans le screencast ci-dessous :

Créez des permissions plus fines

Nous venons de limiter l’accès aux personnes authentifiées, mais est-ce suffisant ?

La réponse est non, c’est un premier niveau de sécurité, mais en l’état, les clients de notre boutique pourraient alors administrer nos catégories en disposant seulement d’un compte utilisateur.

DRF propose des permissions, je vous propose encore mieux ! De créer les nôtres. ;)

Faisons ensemble en sorte que seuls les administrateurs puissent accéder à cet endpoint. Créons un fichier nommé permissions.py  dans notre application Django shop.

from rest_framework.permissions import BasePermission
 
class IsAdminAuthenticated(BasePermission):
 
    def has_permission(self, request, view):
    # Ne donnons l’accès qu’aux utilisateurs administrateurs authentifiés
        return bool(request.user and request.user.is_authenticated and request.user.is_superuser)

Il ne nous reste plus qu’à modifier notre vue pour utiliser notre nouvelle permission :

from shop.permissions import IsAdminAuthenticated
 
class AdminCategoryViewset(MultipleSerializerMixin, ModelViewSet):
 
    serializer_class = CategoryListSerializer
    detail_serializer_class = CategoryDetailSerializer
    permission_classes = [IsAdminAuthenticated]
 
    def get_queryset(self):
        return Category.objects.all()

Notre endpoint est à présent protégé et accessible seulement aux administrateurs authentifiés. Un simple compte utilisateur ne suffit plus pour pouvoir y accéder.

Suivez-moi dans le screencast ci-dessous pour voir comment j'ai mis en place des permissions plus fines pour nos administrateurs :

Les permissions permettent la mise en place de règles de contrôle strictes. Avoir une permission par « acteur » (clients, partenaires, utilisateurs, administrateurs, etc.) de notre API est un bon moyen de gérer qui peut accéder à quels endpoints.

À vous de jouer

Allons plus loin dans nos contrôles ! Pour diverses raisons, un utilisateur administrateur n’est pas membre de l’équipe de la boutique. Il faudrait qu'il puisse n'avoir accès à l’administration qu'en tant que prestataire, et nous ne souhaitons pas qu’il puisse ajouter de nouvelles catégories.

Je vous propose donc de mettre en place une nouvelle permission qui va vérifier que l’utilisateur fasse également partie de l’équipe, en vérifiant que is_staff  du model User  est bien à True.

Les deux permissions pourront alors être mises en place sur le Viewset d’administration de catégorie.

Disposer de deux permissions nous permettra par la suite de donner l’accès à certains endpoints aux membres de l’équipe sans qu’ils aient besoin de disposer d’un compte administrateur, par exemple.

Pour réaliser cela, vous pouvez partir de la branche P2C3_exercice. Elle contient déjà ce que nous venons de faire ensemble. Une solution est proposée sur la branche P2C3_solution.

En résumé

  • Les permissions permettent de limiter l’accès aux endpoints.

  • DRF fournit certaines permissions, mais il est possible de créer les nôtres.

  • Disposer une permission par acteur permet de facilement savoir sur quels endpoints les permissions doivent être placées.

  • Lors de la mise en place d’un nouvel endpoint, il est important de savoir qui va l’utiliser, pour déterminer s’il doit rester public ou doit posséder certaines permissions.

Notre API est toute sécurisée. Je vous invite maintenant à valider vos acquis de cette partie dans le quiz. Après, nous reviendrons sur tout ce que vous avez accompli pendant ce cours !

Exemple de certificat de réussite
Exemple de certificat de réussite