API avec utilisateurs, rôles et permissions avec Django DRF
Repères utiles :
- Django DRF LLM Wiki
- SCHEMA
- Comprendre Django
- Comprendre Django REST Framework
- Comment penser une API avec Django DRF
- Les briques de base de Django DRF
- Backend pour application web ou mobile avec Django DRF
- Parcours de lecture
- FAQ, erreurs fréquentes et conseils pratiques
Ce tutoriel explique comment penser une API où tous les utilisateurs n'ont pas les mêmes droits. L'objectif est de comprendre quand Django DRF est pertinent pour ce besoin, comment structurer mentalement les rôles et permissions, quelles erreurs éviter, et comment construire une base saine avant même d'entrer dans les détails de code.
1. Introduction
Dès qu'une application a plusieurs types d'utilisateurs, une question centrale apparaît :
qui a le droit de voir, créer, modifier ou supprimer quoi ?
Tant que l'on a une application très simple, cette question peut sembler secondaire. Mais en réalité, c'est souvent l'une des questions les plus structurantes d'un backend.
Pourquoi ? Parce que si la gestion des accès est floue, l'application devient vite :
- dangereuse
- incohérente
- difficile à faire évoluer
- pénible à maintenir
Ce tutoriel est écrit pour quelqu'un qui veut comprendre :
- ce qu'on veut vraiment dire par utilisateurs, rôles et permissions
- pourquoi Django DRF est un bon choix pour ce type de besoin
- comment penser une API sécurisée et lisible
- comment éviter les erreurs de conception les plus fréquentes
2. Le problème concret à résoudre
Imaginons une application avec plusieurs profils :
- un utilisateur standard
- un manager
- un administrateur
- éventuellement un opérateur interne ou un support
Très vite, ces profils n'ont pas les mêmes droits.
Exemples classiques :
- un utilisateur peut voir uniquement ses propres données
- un manager peut voir les objets de son équipe
- un admin peut gérer plus largement le système
- un support peut lire certaines données sans tout modifier
Le vrai problème n'est donc pas seulement de “connecter des gens”. Le vrai problème est de contrôler finement l'accès aux ressources.
3. Pourquoi ce use case est si fréquent
Ce use case revient partout.
On le retrouve dans :
- les SaaS
- les outils internes
- les plateformes B2B
- les apps de gestion
- les systèmes d'approbation
- les applications RH
- les plateformes d'inspection ou de reporting
- les dashboards d'entreprise
En pratique, dès que tu as plusieurs acteurs avec plusieurs niveaux de responsabilité, tu es déjà dans ce use case.
4. Pourquoi Django DRF est pertinent ici
Django DRF est particulièrement fort dans ce type de projet, car il repose sur un socle déjà très utile.
4.1 Django a déjà une vraie base utilisateur
Django fournit déjà des briques solides pour :
- les utilisateurs
- les mots de passe
- les groupes
- les permissions
- les sessions
Cela ne résout pas tout à ta place, mais te donne un terrain de départ sérieux.
4.2 DRF ajoute la couche API nécessaire
DRF rend plus naturel le fait de gérer dans une API :
- l'authentification
- les permissions
- les accès par vue
- les accès par ressource
- les réponses cohérentes lorsqu'un accès est refusé
4.3 Le couple Django + DRF aide à garder les responsabilités claires
Avec une bonne discipline, tu peux structurer :
- qui est l'utilisateur
- quel est son rôle
- ce qu'il peut faire
- sur quelles ressources
- avec quelles limites
4.4 Ce use case demande de la durabilité
La gestion des rôles et permissions vieillit rarement bien si elle est bricolée. Django DRF aide justement à installer une base plus stable, plus explicite et plus maintenable.
5. Quand utiliser Django DRF pour ce cas
Ce choix est particulièrement bon si ton application a :
- plusieurs profils utilisateur
- plusieurs niveaux de droits
- des ressources métier sensibles
- des données qui ne doivent pas être visibles par tout le monde
- des actions réservées à certains rôles
- un besoin de croissance maîtrisée de la politique d'accès
Exemples typiques :
- une plateforme où un employé, un manager et un admin n'ont pas la même vue
- une app où chaque utilisateur ne voit que ses objets
- un système où certains rôles valident, d'autres créent, d'autres supervisent
6. Quand Django DRF n'est pas forcément nécessaire pour ce cas
Si ton besoin est ultra simple, Django DRF peut être plus structuré que nécessaire.
Exemples où il faut réfléchir avant de le choisir :
- une mini-application sans vraie notion de rôles
- un projet où tout le monde a exactement les mêmes droits
- un backend très petit et temporaire
- une application qui ne possède quasiment pas de logique de sécurité autre que “connecté ou non connecté”
Mais attention : beaucoup de projets pensent au début qu'ils n'auront que deux cas simples, puis découvrent très vite qu'il faut gérer des exceptions, des droits d'équipe, des accès partiels, des rôles internes, etc.
7. Pré-requis
Pour bien comprendre ce tutoriel, il est utile d'avoir déjà en tête :
- ce qu'est un backend
- ce qu'est une API
- la différence entre frontend et backend
- quelques bases sur Django et DRF
Les notes de fondation à relire si nécessaire sont :
- Comprendre Django
- Comprendre Django REST Framework
- Comment penser une API avec Django DRF
- Les briques de base de Django DRF
8. Vocabulaire indispensable
Utilisateur
Une identité connue du système.
Authentification
Le mécanisme qui permet de répondre à la question :
qui est cette personne ?
Autorisation
La logique qui répond à la question :
cette personne a-t-elle le droit de faire cette action ?
Rôle
Une manière simple de regrouper certains droits ou responsabilités.
Exemples : member, manager, admin, support.
Permission
Une règle plus précise qui détermine si une action est autorisée dans un contexte donné.
Ressource
Un objet métier exposé via l'API. Exemples : projet, tâche, dossier, rapport, commentaire.
Permission globale
Une permission qui s'applique à une vue ou à une action de manière générale. Exemple : “il faut être authentifié”.
Permission objet
Une permission qui dépend de l'objet concerné. Exemple : “cet utilisateur peut modifier seulement son propre projet”.
9. La distinction la plus importante : auth n'est pas permission
Beaucoup de débutants mélangent ces deux choses.
Il faut les séparer clairement.
L'authentification répond à :
- qui est connecté ?
- cette requête vient-elle bien d'un utilisateur reconnu ?
Les permissions répondent à :
- cette personne peut-elle lire ?
- peut-elle créer ?
- peut-elle modifier ?
- peut-elle supprimer ?
- peut-elle agir sur cet objet précis ?
Une application peut avoir une bonne authentification et de très mauvaises permissions. Être capable d'identifier un utilisateur ne suffit pas à sécuriser une API.
10. Vision d'ensemble
Dans ce use case, le backend doit faire beaucoup plus que “renvoyer des données”. Il doit aussi servir de gardien d'accès.
Le flux mental est souvent le suivant :
- un client appelle l'API
- le backend identifie l'utilisateur
- il détermine son rôle ou son contexte d'accès
- il vérifie l'action demandée
- il vérifie si cette action est permise sur cette ressource
- il exécute ou refuse
- il renvoie une réponse claire
L'idée essentielle est donc :
une API avec rôles et permissions est avant tout un système de contrôle d'accès cohérent, pas seulement une collection d'endpoints.
11. Architecture type
Voici une architecture mentale simple pour ce use case.
graph TD
A[Frontend web ou mobile] --> B[API Django DRF]
B --> C[Authentification]
B --> D[Permissions]
B --> E[Logique métier]
E --> F[Base de données]
B --> G[Admin Django / outils internes]
11.1 Le frontend
Il envoie des demandes d'accès et d'action. Mais il ne doit pas être l'arbitre final des droits.
11.2 L'API Django DRF
Elle reçoit les requêtes et orchestre l'ensemble.
11.3 L'authentification
Elle identifie l'utilisateur.
11.4 Les permissions
Elles appliquent les règles de lecture et d'écriture.
11.5 La logique métier
Elle contient des règles plus profondes que le simple accès. Exemple : même un manager autorisé ne peut pas clôturer un dossier si certaines conditions ne sont pas réunies.
11.6 L'admin et les outils internes
Ils peuvent servir à superviser, corriger ou auditer les données.
12. Les grandes questions à trancher avant d'implémenter
12.1 Qui sont les acteurs du système ?
Exemples :
- visiteur
- utilisateur connecté
- membre
- manager
- administrateur
- support
12.2 Quels objets doivent être protégés ?
Exemples :
- projets
- rapports
- documents
- utilisateurs
- commentaires
- tickets
12.3 Quelles actions sont sensibles ?
Exemples :
- lecture
- création
- mise à jour
- suppression
- validation
- archivage
- export
- changement d'état
12.4 Les droits dépendent-ils du rôle, de l'objet, ou des deux ?
C'est une question fondamentale. Parfois le rôle suffit. Parfois non.
Exemple :
- un manager peut modifier certains objets
- mais seulement ceux de son périmètre
Ici, le rôle seul ne suffit pas. Il faut aussi une logique objet.
13. Trois grands niveaux de complexité
Niveau 1 — Connecté ou non connecté
Le plus simple. Exemple :
- tout utilisateur connecté peut utiliser la majorité de l'API
- tout utilisateur non connecté est refusé
Niveau 2 — Rôles distincts
Exemple :
- admin
- manager
- member
Chaque rôle a des actions différentes.
Niveau 3 — Règles contextuelles et permissions objet
Exemple :
- un utilisateur peut modifier un projet seulement s'il en est propriétaire
- un manager peut agir sur les objets de son équipe mais pas sur ceux d'une autre équipe
- un support peut lire sans modifier
C'est souvent à ce niveau que les projets réels deviennent intéressants.
14. Construction pas à pas
Voici une manière saine de construire ce type d'API.
Étape 1 — Clarifier les acteurs
Commence par écrire noir sur blanc les profils du système.
Exemples :
- utilisateur standard
- manager
- admin
L'erreur fréquente serait de garder cela flou trop longtemps.
Étape 2 — Clarifier les ressources sensibles
Demande-toi quelles données ou actions méritent une protection explicite.
Exemples :
- profil utilisateur
- rapport interne
- document confidentiel
- projet d'équipe
Étape 3 — Écrire une matrice d'accès simple
Avant même le code, il est souvent très utile d'écrire une grille du type :
- qui peut voir ?
- qui peut créer ?
- qui peut modifier ?
- qui peut supprimer ?
- qui peut valider ?
Cette étape évite énormément de confusion plus tard.
Étape 4 — Distinguer permissions globales et permissions objet
Cette distinction change tout.
Exemple :
- permission globale : il faut être authentifié pour accéder à la vue
- permission objet : tu peux modifier uniquement les objets qui t'appartiennent
Étape 5 — Décider comment représenter les rôles
Il faut choisir une stratégie conceptuelle claire.
Par exemple :
- rôle simple attaché au profil utilisateur
- groupes logiques
- combinaison rôle + contexte métier
L'important n'est pas seulement la technique. L'important est que la logique reste lisible pour l'équipe.
Étape 6 — Décider ce qui doit être visible dans l'API
Tout ce qu'un objet contient n'a pas forcément vocation à être visible pour tous les rôles.
Il faut réfléchir à :
- quels champs sont publics
- quels champs sont privés
- quels champs sont réservés à certains profils
Étape 7 — Faire vivre les règles dans le backend
Ne te contente jamais de masquer des boutons côté frontend. Le backend doit réellement bloquer les actions non autorisées.
Étape 8 — Prévoir la montée en complexité
Même si aujourd'hui tu n'as que trois rôles, demain tu pourras avoir :
- des rôles temporaires
- des permissions d'équipe
- des accès en lecture seule
- des statuts spéciaux
- des auditeurs ou superviseurs
Il faut donc poser un modèle mental qui pourra évoluer.
15. Exemple mental concret
Prenons une application de gestion de dossiers.
Acteurs
- membre
- manager
- admin
Ressource
- dossier
Règles possibles
- un membre voit ses propres dossiers
- un membre ne modifie pas les dossiers validés
- un manager voit les dossiers de son équipe
- un manager peut approuver certains dossiers
- un admin peut tout voir et superviser
Tu vois ici que la difficulté ne vient pas du fait de “faire une route”. La difficulté vient du fait de faire respecter les règles du produit.
16. Ce que le frontend ne doit jamais porter seul
Le frontend peut :
- masquer un bouton
- adapter l'affichage
- guider l'utilisateur
Mais il ne doit jamais être l'unique barrière de sécurité.
Le backend doit aussi contrôler :
- l'accès à la route
- l'accès à la ressource
- l'autorisation de l'action
- les transitions métier
Sinon, un utilisateur pourrait appeler directement l'API en contournant l'interface.
17. Erreurs fréquentes
Erreur 1 — Confondre rôle et permission
Un rôle est un regroupement pratique. Une permission est une règle plus précise. Les deux sont liés, mais pas identiques.
Erreur 2 — Gérer les droits uniquement côté frontend
C'est insuffisant et dangereux.
Erreur 3 — Attendre la fin pour penser la sécurité
Si tu ajoutes la logique d'accès trop tard, tu risques de devoir refactorer beaucoup.
Erreur 4 — Penser uniquement en rôles globaux
Dans les vrais projets, les droits dépendent souvent aussi du contexte et de l'objet.
Erreur 5 — Faire une politique d'accès implicite
Si l'équipe ne peut pas expliquer clairement qui peut faire quoi, la sécurité deviendra floue.
Erreur 6 — Exposer trop de données à des rôles qui n'en ont pas besoin
Une API trop bavarde crée du risque et de la confusion.
18. Bonnes pratiques
18.1 Écrire la politique d'accès en français avant de l'implémenter
C'est une pratique très sous-estimée.
Par exemple :
- un membre peut voir ses propres objets
- un manager peut voir ceux de son équipe
- un admin peut superviser l'ensemble
Si cette phrase n'est pas claire, le code sera probablement flou aussi.
18.2 Prévoir les permissions objet tôt
Beaucoup de projets commencent avec des permissions trop globales puis découvrent qu'elles sont insuffisantes.
18.3 Rester cohérent d'une ressource à l'autre
Si deux ressources suivent la même logique d'accès, la politique doit être cohérente.
18.4 Séparer identification, autorisation et logique métier
Ces trois choses sont liées, mais ne doivent pas être mélangées au point de devenir illisibles.
18.5 Penser à l'audit et à l'exploitation
Dans les projets réels, il est souvent utile de savoir :
- qui a fait quoi
- qui a modifié quoi
- qui a validé quoi
19. Variantes et évolutions possibles
Variante 1 — Système simple à trois rôles
Un début raisonnable pour beaucoup de projets.
Variante 2 — Permissions par équipe ou organisation
Très fréquent dans les SaaS B2B.
Variante 3 — Lecture et écriture dissociées
Certains rôles peuvent lire sans modifier.
Variante 4 — Actions métier spéciales
Exemples : approuver, rejeter, archiver, exporter.
Variante 5 — Multi-tenant plus avancé
Les droits dépendent alors de l'organisation, de l'espace ou du compte client.
20. Comment savoir si ton design est bon
Tu vas dans la bonne direction si :
- tu sais expliquer clairement qui peut faire quoi
- tu sais distinguer auth, rôle et permission
- tu sais quels droits dépendent du rôle seul et lesquels dépendent de l'objet
- tu peux justifier pourquoi certaines données sont visibles ou cachées
- la logique d'accès ne vit pas uniquement dans le frontend
21. Résumé final
Django DRF est un excellent choix pour construire une API avec utilisateurs, rôles et permissions lorsque ton application doit gérer des accès différenciés de manière sérieuse.
Sa force vient du fait qu'il permet de structurer :
- l'identité de l'utilisateur
- la logique d'accès
- la protection des ressources
- la cohérence globale de l'API
L'idée la plus importante à retenir est la suivante :
dans ce use case, le backend n'est pas seulement un fournisseur de données ; c'est un arbitre de confiance qui décide ce que chaque acteur a le droit de faire.
22. Pour aller plus loin
Après ce tutoriel, la suite logique du wiki peut être :
- Application métier / SaaS / outil interne avec Django DRF
- ou un futur chapitre de soutien sur les notions de
authentication,authorization,permissionetrole - ou une comparaison future entre plusieurs stratégies d'organisation des accès
Relire aussi :
- Comment penser une API avec Django DRF
- Les briques de base de Django DRF
- Backend pour application web ou mobile avec Django DRF
23. Mini-projet guidé avec code
Pour rendre ce use case vraiment concret, on va prendre un mini-exemple réaliste :
une API d'équipe où plusieurs utilisateurs travaillent dans un même espace, mais n'ont pas tous les mêmes droits
Le but du mini-projet est de permettre :
- à un admin de gérer l'espace d'équipe
- à un manager de publier des rapports
- à un member de lire les rapports autorisés sans pouvoir créer n'importe quoi
C'est exactement le genre de situation où Django REST Framework ne sert pas seulement à exposer du JSON : il sert à faire respecter qui peut faire quoi.
24. Structure du mini-projet
Arborescence minimale :
secureapi/
├── manage.py
├── secureapi/
│ ├── settings.py
│ ├── urls.py
│ └── ...
└── access/
├── admin.py
├── models.py
├── serializers.py
├── permissions.py
├── views.py
└── urls.py
Repères utiles avant de lire le code :
settings.pyactive DRF avec une base d'authentification cohérente pour une API protégée.models.pyrend explicites l'équipe, l'appartenance à l'équipe et la ressource protégée.serializers.pydéfinit le contrat d'API pour les rapports.permissions.pyencode les règles qui combinent rôle, appartenance et objet visé.views.pyapplique le bon périmètre de lecture et d'écriture pour chaque utilisateur.urls.pyexpose le point d'entrée principal/api/reports/.admin.pyaide à préparer rapidement des scénarios de test réalistes.
25. Implémentation guidée avec code
Étape 1 — Créer le projet et installer DRF
python -m venv .venv
source .venv/bin/activate
pip install django djangorestframework
django-admin startproject secureapi .
python manage.py startapp access
Pourquoi ? Parce qu'on veut un projet très simple où la vraie complexité n'est pas le nombre de fichiers, mais la gestion des accès.
Étape 2 — Déclarer DRF et l'application dans settings.py
Dans secureapi/settings.py :
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"rest_framework",
"access",
]
REST_FRAMEWORK = {
"DEFAULT_PERMISSION_CLASSES": [
"rest_framework.permissions.IsAuthenticated",
],
"DEFAULT_AUTHENTICATION_CLASSES": [
"rest_framework.authentication.SessionAuthentication",
"rest_framework.authentication.BasicAuthentication",
],
}
Pourquoi ? Parce qu'ici une API anonyme n'aurait pas de sens : la première porte d'entrée, c'est déjà l'authentification.
Étape 3 — Modéliser l'équipe, les rôles et les rapports
Dans access/models.py :
from django.conf import settings
from django.db import models
class Team(models.Model):
name = models.CharField(max_length=120)
def __str__(self) -> str:
return self.name
class TeamMembership(models.Model):
ROLE_CHOICES = [
("admin", "Admin"),
("manager", "Manager"),
("member", "Member"),
]
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name="team_memberships",
)
team = models.ForeignKey(
Team,
on_delete=models.CASCADE,
related_name="memberships",
)
role = models.CharField(max_length=20, choices=ROLE_CHOICES)
class Meta:
constraints = [
models.UniqueConstraint(
fields=["user", "team"],
name="unique_membership_per_team",
)
]
def __str__(self) -> str:
return f"{self.user} - {self.team} ({self.role})"
class Report(models.Model):
team = models.ForeignKey(
Team,
on_delete=models.CASCADE,
related_name="reports",
)
title = models.CharField(max_length=150)
body = models.TextField()
is_private = models.BooleanField(default=False)
created_by = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name="created_reports",
)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self) -> str:
return self.title
Puis lancer :
python manage.py makemigrations
python manage.py migrate
Pourquoi ? Parce qu'avant de coder des permissions, il faut rendre explicites les trois briques métier :
- l'équipe
- l'appartenance à l'équipe
- la ressource protégée
Étape 4 — Créer les serializers DRF
Dans access/serializers.py :
from rest_framework import serializers
from .models import Report, TeamMembership
class TeamMembershipSerializer(serializers.ModelSerializer):
class Meta:
model = TeamMembership
fields = ["id", "team", "role"]
read_only_fields = ["id"]
class ReportSerializer(serializers.ModelSerializer):
created_by = serializers.StringRelatedField(read_only=True)
class Meta:
model = Report
fields = [
"id",
"team",
"title",
"body",
"is_private",
"created_by",
"created_at",
]
read_only_fields = ["id", "created_by", "created_at"]
Pourquoi ? Parce que le serializer définit ce que l'API accepte et ce qu'elle renvoie. Il transforme la règle métier en contrat lisible pour le frontend et pour les intégrateurs.
Étape 5 — Écrire la permission personnalisée
Dans access/permissions.py :
from rest_framework.permissions import BasePermission, SAFE_METHODS
from .models import TeamMembership
class IsTeamMemberAndCanManageReports(BasePermission):
def _membership(self, user, team):
return TeamMembership.objects.filter(user=user, team=team).first()
def has_permission(self, request, view):
if not request.user or not request.user.is_authenticated:
return False
if request.method in SAFE_METHODS:
return True
team_id = request.data.get("team")
if not team_id:
return False
return TeamMembership.objects.filter(
user=request.user,
team_id=team_id,
role__in=["admin", "manager"],
).exists()
def has_object_permission(self, request, view, obj):
membership = self._membership(request.user, obj.team)
if not membership:
return False
if request.method in SAFE_METHODS:
return True
return membership.role == "admin" or obj.created_by == request.user
Pourquoi ce code est important ? Parce qu'il montre exactement ce qu'on attendait de ce chapitre :
- un utilisateur authentifié n'est pas automatiquement autorisé partout
- le rôle n'est pas une simple étiquette décorative
- la décision dépend parfois du rôle, parfois de l'objet, parfois des deux
Étape 6 — Créer le viewset DRF
Dans access/views.py :
from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated
from .models import Report
from .permissions import IsTeamMemberAndCanManageReports
from .serializers import ReportSerializer
class ReportViewSet(viewsets.ModelViewSet):
serializer_class = ReportSerializer
permission_classes = [IsAuthenticated, IsTeamMemberAndCanManageReports]
def get_queryset(self):
return (
Report.objects.filter(team__memberships__user=self.request.user)
.select_related("team", "created_by")
.distinct()
.order_by("-created_at")
)
def perform_create(self, serializer):
serializer.save(created_by=self.request.user)
Pourquoi ? Parce que le viewset traduit maintenant le use case en comportement réel :
- on ne voit que les rapports de ses équipes
- on ne peut pas écrire si on n'a pas le bon rôle
- l'auteur est fixé côté backend, pas laissé au frontend
Étape 7 — Brancher les routes
Dans access/urls.py :
from rest_framework.routers import DefaultRouter
from .views import ReportViewSet
router = DefaultRouter()
router.register("reports", ReportViewSet, basename="report")
urlpatterns = router.urls
Dans secureapi/urls.py :
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("admin/", admin.site.urls),
path("api/", include("access.urls")),
]
Étape 8 — Enregistrer les modèles dans l'admin
Dans access/admin.py :
from django.contrib import admin
from .models import Report, Team, TeamMembership
admin.site.register(Team)
admin.site.register(TeamMembership)
admin.site.register(Report)
Pourquoi ? Parce que l'admin Django permet ici de créer rapidement une équipe, d'ajouter des membres et de visualiser les rapports sans construire tout de suite un back-office spécifique.
26. Vérification guidée
Préparer des utilisateurs de test
Le plus simple est de :
- créer un superuser
- créer deux utilisateurs classiques dans l'admin
- créer une équipe
- donner le rôle
managerà l'un etmemberà l'autre
python manage.py createsuperuser
python manage.py runserver
Tester en lecture
Un membre d'équipe doit pouvoir lire les rapports de son équipe :
curl -u member:password http://127.0.0.1:8000/api/reports/
Tester en écriture avec un manager
curl -u manager:password -X POST http://127.0.0.1:8000/api/reports/ \
-H "Content-Type: application/json" \
-d '{
"team": 1,
"title": "Rapport hebdomadaire",
"body": "Tout est sous contrôle.",
"is_private": false
}'
Vérifier qu'un membre simple ne peut pas créer
La même requête avec member:password doit renvoyer un refus (403 Forbidden).
Ce que tu dois observer
- un utilisateur authentifié sans appartenance d'équipe ne voit rien
- un membre peut consulter mais ne peut pas forcément écrire
- un manager peut créer
- un admin garde les droits les plus larges
- le backend reste l'arbitre central des accès
27. Ce que cet exemple t'apprend vraiment
Cet exemple montre concrètement comment DRF est utilisé dans ce use case :
- le modèle représente la structure sociale du système
- le serializer définit le contrat d'API
- la permission personnalisée encode les règles d'accès
- le viewset applique ces règles à chaque endpoint
- l'admin Django aide à exploiter et tester rapidement le système
Autrement dit, on ne parle plus seulement de rôles et permissions de manière abstraite : on voit comment ces idées deviennent du code backend vérifiable.
Si tu comprends bien ce mini-projet, tu franchis un cap important : tu ne vois plus l'autorisation comme une couche vague ou secondaire, mais comme une partie centrale de la conception d'une API fiable.