Menu

Comment Implémenter un Système de Connexion – Authentification Django 1° Partie

Authentication system

[Source image : stories – fr.freepik.com ]

Dans ce nouveau tutoriel, l’objectif est de vous montrer comment intégrer les fonctionnalités d’inscription et de connexion d’un utilisateur de votre application Django. Pour ce faire, nous pouvons utiliser le système d’authentification de base de Django, que nous enrichirons selon notre besoin.

Notre système d’authentification comprendra les fonctionnalités suivantes :

  • L’inscription
  • La connexion
  • La déconnexion
  • La réinitialisation de mot de passe

A l’exception de la fonctionnalité permettant d’inscrire un nouvel utilisateur, Django fournit des vues (“views” en anglais) par défaut pour toutes les autres fonctionnalités du système d’authentification. Nous aurons l’occasion de voir cela dans la suite du tutoriel, juste avant de personnaliser les templates associés à ces vues.

Déroulement du tutoriel

Dans ce tutoriel, organisé sous la forme de trois articles, nous commencerons par ajouter les fonctionnalités déjà intégrées dans le système d’authentification par défaut de Django. Nous mettrons en place les pages de connexion et de déconnexion d’un utilisateur, puis nous verrons comment ce dernier peut modifier/réinitialiser son mot de passe. Après cela, nous ajouterons la fonctionnalité d’inscription.

Ce premier article fait partie de la série suivante :

Première partie : Connexion et déconnexion

Deuxième partie : Réinitialisation de mot de passe

Troisième partie : Inscription d’un nouvel utilisateur

Dans cette première partie du tutoriel, nous mettrons en place un projet Django basique qui consistera en une application de prise de notes. Nous y ajouterons ensuite les premières briques de notre système d’authentification, à savoir les fonctionnalités de connexion (“login” en anglais) et de déconnexion (“logout” en anglais) de l’application.

Le code source de l’application qu’on nous allons construire est sur GitHub.

Préparation du projet de base

Je pars du principe que vous savez déjà comment créer un projet Django. Si ce n’est pas le cas, pas de panique! Même si on ne va pas tout expliquer en détail, sachez que cela a déjà fait l’objet d’autres articles (premier projet Django, comment réaliser une ToDoApp), que vous pouvez consulter à tout moment. Démarrons donc ce petit projet Django selon les étapes qui vont suivre.

Créer le répertoire du projet

Vérifiez que python est bien installé. Si ce n’est pas déjà fait, référez vous à cet article. Nous appellerons le répertoire du projet mynotes.

D:\DEV>mkdir mynotes
D:\DEV>cd mynotes

Créer et activer un environnement virtuel

Une fois dans le répertoire du projet, on crée l’environnement virtuel venv du projet et on l’active.

D:\DEV\mynotes>python -m venv venv
D:\DEV\mynotes>venv\Scripts\activate

Installer Django

On installe ensuite Django avec la commande pip install django.

(venv) D:\DEV\mynotes>python -m pip install --upgrade pip
(venv) D:\DEV\mynotes>pip install django

Créer le projet et l’application

On nommera le projet django mynotes. A la racine du projet, on crée l’application mynotesapp.

(venv) D:\DEV\mynotes>django-admin startproject mynotes
(venv) D:\DEV\mynotes>cd mynotes
(venv) D:\DEV\mynotes\mynotes>django-admin startapp mynotesapp

Installer l’application dans le projet

Dans le fichier settings.py du projet, on ajoute dans la liste des applications installées INSTALLED_APPS notre application mynotesapp.

...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'mynotesapp',
]
...

Créer un modèle

Dans le fichier models.py de l’application mynotesapp, nous aurons à définir un modèle, que l’on nommera Note. Ce modèle aura pour attributs un titre title, un contenu content, une date de création creation_date et un auteur author. Vous noterez que l’attribut author est une clé étrangère (“Foreign Key” en anglais), qui fait référence au modèle User prédéfinit dans Django.

from django.db import models
from django.contrib.auth.models import User

class Note(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    creation_date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
	
    def __str__(self):
        return self.title

Effectuer les migrations

On crée la table correspondant à notre modèle dans la base de données du projet à l’aide du système de migration de Django.

(venv) D:\DEV\mynotes\mynotes>python manage.py makemigrations
(venv) D:\DEV\mynotes\mynotes>python manage.py migrate

Enregistrer le modèle dans AdminSite

Si on veut accéder à notre modèle à partir du portail d’administration, il suffit d’importer le modèle et de l’enregistrer dans admin.py.

from django.contrib import admin
from .models import Note

admin.site.register(Note)

Créer un superutilisateur

Pour accéder au portail d’administration du projet, on crée un superutilisateur à l’aide de la commande ci-dessous :

(venv) D:\DEV\mynotes\mynotes> python manage.py createsuperuser

Il faut ensuite suivre les instructions et entrer un nom d’utilisateur et un mot de passe.

Alimenter les tables de données

Pour ajouter des données, on peut utiliser le portail d’administration du projet ou bien l’invite de commandes. Pour ce tutoriel, nous allons utiliser le site d’administration Django.

Ajouter des utilisateurs

Pour lancer l’application, on utilise la commande suivante :

(venv) D:\DEV\mynotes\mynotes>python manage.py runserver

On accède au portail d’administration via l’url http://127.0.0.1:8000/admin. On se connecte en utilisant les identifiants de superutilisateur.

En cliquant sur Users, vous pourrez voir le compte du superuser créé précédemment. Vous pourrez ajouter d’autres utilisateurs en cliquant sur le bouton Add.

Comme mentionné dans le formulaire d’ajout d’un nouvel utilisateur, vous devez d’abord saisir un nom d’utilisateur et un mot de passe.

Vous aurez ensuite l’occasion d’éditer le profil utilisateur et ajouter d’autres données comme une adresse e-mail par exemple. Cela nous sera utile lorsque nous ajouterons la fonctionnalité de réinitialisation du mot de passe.

Ajouter des Notes

L’ajout de notes est similaire à ce que nous venons de faire plus haut avec les utilisateurs. Pour inscrire une nouvelle note, on clique sur le bouton add associé à la table Notes, qui se trouve sous le volet de l’application MYNOTESAPP. On saisie ensuite les données et on enregistre les modifications en cliquant sur save.

Créer la page d’accueil

La Vue

La vue de notre page d’accueil consistera à afficher les notes d’un utilisateur connecté. Les notes seront listées dans le template home.html.

from django.shortcuts import render
from mynotesapp.models import Note

def home(request):
	context ={
	'notes': Note.objects.all()
	}
	return render(request, 'home.html',context)

On va ensuite créer le répertoire templates à la racine du projet et on y mettra les templates base.html et home.html.

(venv) D:\DEV\mynotes\mynotes>mkdir templates

On ajoute ce répertoire dans le fichier settings.py du projet.

TEMPLATES = [
    {
       ...
        'DIRS': ['templates'],        
      ...
    },
]

Le Template de base

Pour le template base.html qui sera la base commune aux différentes pages de notre projet, on peut partir de la page ci-après. Celle-ci est un exemple de template bootstrap.

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">

    <title>Accueil</title>
  </head>
  <body>
     <nav class="navbar navbar-expand-md navbar-dark bg-primary">
      <a class="navbar-brand" href="{% url 'home' %}">Mes Notes</a>
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>

      <div class="collapse navbar-collapse" id="navbarsExampleDefault">
        <ul class="navbar-nav mr-auto">
          <li class="nav-item active">
            <a class="nav-link" href="{% url 'home' %}">Accueil<span class="sr-only">(current)</span></a>
          </li>
        </ul>
      </div>
    </nav>
	<br>
    <main role="main" class="container">
      <div>
        {% block content %}
        {% endblock %}
      </div>

    </main>
    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-ho+j7jyWK8fNQe+A12Hb8AhRq26LrZ/JpcUGGOn+Y7RsweNrtN/tE3MoK7ZeZDyx" crossorigin="anonymous"></script>

  </body>
</html>

Le Template de la page d’accueil

Pour le template de la page d’accueil home.html, on utilisera le code ci-après, consistant à afficher les notes des utilisateurs.

{% extends "base.html" %}
{% block content %}
{%if notes %}
    {% for note in notes %}
        <article class="media content-section">
            <div class="media-body">                
                <h2><a class="article-title" href="#">{{ note.title }}</a></h2>
                <div class="article-metadata">
                    <small class="article-author">{{ note.author }}, </small>
                    <small class="article-date">{{ note.creation_date }}</small>
                </div>
                <p class="article-content">{{ note.content }}</p>
            </div>
        </article>
    {% endfor %}
{% else %}
       <h5 class="alert alert-warning">Vous n'avez pas encore de notes !</h5>
{% endif %}
{% endblock %}

Les Urls

Dans le répertoire de l’application, on définit le fichier urls.py. On inscrit dans celui-ci le chemin vers notre page d’accueil.

from django.urls import path
from mynotesapp import views

urlpatterns =[
	path('',views.home, name='home'),
]

Dans le fichier urls.py du projet, on ajoute les chemins vers notre application mynotesapp.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('mynotesapp.urls')),
]

On relance ensuite le serveur pour vérifier que l’application fonctionne correctement à l’adresse http://127.0.0.1:8000.

Pour l’instant, tout le monde peut voir les notes des utilisateurs et ce n’est pas ce que nous voulons. Nous allons donc ajouter un système d’authentification, pour que chaque utilisateur puisse se connecter et ne voir que ses propres notes.

Mise en place du système d’authentification

Créer une nouvelle application

Pour gérer les données et opérations d’authentification des utilisateurs, nous allons créer une nouvelle application que l’on nommera usersapp.

(venv) D:\DEV\mynotes\mynotes>django-admin startapp usersapp

Enregistrer l’application

Dans le fichier de configuration du projet, on inscrit l’application dans la liste des applications installées.

...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'mynotesapp',
    'usersapp',
]
...

Ajouter les URLs

Dans un premier temps, nous allons créer, à la racine de l’application usersapp, le fichier urls.py et y ajouter les chemins qui mènent aux vues du système d’authentification par défaut de Django.

from django.urls import path, include

urlpatterns =[
	path('accounts/', include('django.contrib.auth.urls')),
]

La ligne path('accounts/', include('django.contrib.auth.urls')) ci-dessus ajoute en réalité les lignes suivantes :

accounts/ login/ [name='login']
accounts/ logout/ [name='logout']
accounts/ password_change/ [name='password_change']
accounts/ password_change/done/ [name='password_change_done']
accounts/ password_reset/ [name='password_reset']
accounts/ password_reset/done/ [name='password_reset_done']
accounts/ reset/<uidb64>/<token>/ [name='password_reset_confirm']
accounts/ reset/done/ [name='password_reset_complete']

Django étant open-source, on peut voir la liste des chemins liés aux vues du système d’authentification par défaut dans le code source, répertorié dans GitHub. Les templates liés à ces vues et chemins seront personnalisés et placés dans un répertoire dédié.

...
urlpatterns = [
    path('login/', views.LoginView.as_view(), name='login'),
    path('logout/', views.LogoutView.as_view(), name='logout'),

    path('password_change/', views.PasswordChangeView.as_view(), name='password_change'),
    path('password_change/done/', views.PasswordChangeDoneView.as_view(), name='password_change_done'),

    path('password_reset/', views.PasswordResetView.as_view(), name='password_reset'),
    path('password_reset/done/', views.PasswordResetDoneView.as_view(), name='password_reset_done'),
    path('reset/<uidb64>/<token>/', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
    path('reset/done/', views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),
]

Dans le répertoire templates, il faudra donc créer un second répertoire que nous nommerons registration et dans lequel seront ajoutés les différents templates liés aux vues du système d’authentification.

On doit aussi ajouter les chemins de l’application usersapp au fichier urls.py du projet.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('mynotesapp.urls')),
    path('', include('usersapp.urls')),
]

Modifier la page de base

Au niveau de la barre de navigation, nous ajoutons des balises conditionnelles {% if user.is_authenticated %} qui permettent de tester si un utilisateur est authentifié ou non dans la page base.html. Si un utilisateur est connecté, on affiche son nom d’utilisateur et le lien de déconnexion. Mais dans le cas où un utilisateur est au niveau de la page d’accueil, sans s’être connecté, alors on affiche le lien de connexion et le lien d’inscription.

...
  <body>
    <h1>Mes notes</h1>
     <nav class="navbar navbar-expand-md navbar-dark bg-primary fixed-top">
      <a class="navbar-brand" href="{% url 'home' %}">Mes Notes</a>
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>

      <div class="collapse navbar-collapse" id="navbarsExampleDefault">
        <ul class="navbar-nav mr-auto">
          <li class="nav-item active">
            <a class="nav-link" href="{% url 'home' %}">Accueil<span class="sr-only">(current)</span></a>
          </li>
        </ul>
        <ul class="navbar-nav ml-auto">
          {% if user.is_authenticated %}
          <li class="nav-item active">
            <a class="nav-link" href="#">{{user}},</a>
          </li>
          <li class="nav-item active">
            <a class="nav-link" href="#">Déconnexion</a>
          </li>
          {% else %}
          <li class="nav-item active">
            <a class="nav-link" href="#">Connexion</a>
          </li>
          <li class="nav-item active">
            <a class="nav-link" href="#">Inscription</a>
          </li>
          {% endif %}
        </ul>
      </div>
    </nav>

    <main role="main" class="container">
      <div>
        {% block content %}
        {% endblock %}
      </div>

    </main>
    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-ho+j7jyWK8fNQe+A12Hb8AhRq26LrZ/JpcUGGOn+Y7RsweNrtN/tE3MoK7ZeZDyx" crossorigin="anonymous"></script>
  </body>
...

Si vous ne vous êtes pas déconnectés de la page d’administration et que vous affichez la page d’accueil de l’application, vous verrez le nom d’utilisateur du superuser indiquant que celui-ci est connecté.

INFO Dans la suite de ce tutoriel, nous allons définir les pages pour les vues du système d’authentification. Mais il faut savoir que les pages de déconnexion et de réinitialisation de mots de passe sont liées au portail d’administration. De ce fait, contrairement à l’opération de connexion pour laquelle il faut définir un template, des templates par défaut sont déjà fournis pour les opérations de déconnexion et de réinitialisation de mot de passe. Nous verrons plus loin comment il est possible de les redéfinir.

Construire la page de connexion

Pour avoir une page de connexion, nous devons définir un template login.html et le placer dans templates/registration.

Définir le template de connexion

Ce template consiste en un formulaire dans lequel l’utilisateur saisit ses informations de connexion pour accéder à ses notes.

{% extends "base.html" %}
{% block content %}
<h2>Se connecter </h2>
<div>
    <form method="post">
        {% csrf_token %}
        {% if form.non_field_errors %}
            {% for error in form.non_field_errors %}
            <p class="alert alert-danger">{{ error }}</p>
            {% endfor %}
        {% endif %}
        <table>
        {% for field in form %}
          <tr>
            <td>{{ field.label_tag }}</td>
            <td>{{ field }}</td>
          </tr>
          
        {% endfor %}
         </table>
        <button type="submit">se connecter</button>
    </form>
</div>

<div>
    <small>
        Pas encore inscrit.e?
        <a href="#">
            S'inscrire
        </a>
    <br>
        Mot de passe oublié ?
        <a href="#">
            Renouveler mon mot de passe
        </a>
    </small>
</div>
{% endblock %}

On peut ensuite redéfinir, dans le fichier urls.py de usersapp, le chemin vers la page de connexion pour ne pas utiliser l’url par défaut.

Redéfinir le chemin vers la page de connexion

Pour cela, on fait appel aux vues d’authentification (ligne 2) et on indique le chemin vers notre template (ligne 6).

NOTE Pour l’instant, nous n’allons pas supprimer la ligne 5 path('accounts/', include('django.contrib.auth.urls')), jusqu’à la fin du tutoriel. En effet, nous utiliserons celle-ci pour avoir un aperçu des tempates par défaut du système d’authentification avant de redéfinir chacun d’eux.

Nous accèderons à la page de connexion selon le chemin défini à la ligne 6. Ainsi, l’url de la page de connexion sera http://127.0.0.1:8000/login/ au lieu de http://127.0.0.1:8000/accounts/login/.

from django.urls import path, include
from django.contrib.auth import views as auth_views

urlpatterns =[
	path('accounts/', include('django.contrib.auth.urls')),
	path('login/', auth_views.LoginView.as_view(template_name='registration/login.html'), name = 'login'),

]

Nous pouvons aussi spécifier l’url de connexion de notre choix dans le fichier de configuration comme ceci :

...
LOGIN_URL = 'login'

Modifier la page de base

On modifie la page de base pour indiquer le chemin menant à la page de connexion (ligne 12). Nous pouvons faire de même pour le lien de déconnexion qui mène à la page de déconnexion par défaut (ligne 8).

...
<ul class="navbar-nav ml-auto">
  {% if user.is_authenticated %}
  <li class="nav-item active">
    <a class="nav-link" href="#">{{user}},</a>
  </li>
  <li class="nav-item active">
    <a class="nav-link" href="{% url 'logout' %}">Déconnexion</a>
  </li>
  {% else %}
  <li class="nav-item active">
    <a class="nav-link" href="{% url 'login' %}">Connexion</a>
  </li>
  <li class="nav-item active">
    <a class="nav-link" href="#">Inscription</a>
  </li>
  {% endif %}
</ul>
...

Tester la page de connexion

Pour tester notre page de connexion, assurez-vous que vous vous-êtes déconnectés en tant que super-utilisateur au niveau du portail d’administration de notre application. Redirigez-vous ensuite vers la page d’accueil pour vous connecter en tant qu’utilisateur simple ou super-utilisateur. Pour cela, cliquez sur le lien Connexion dans la barre de navigation.

Le lien de connexion mène à l’adresse http://127.0.0.1:8000/login/ qui doit ressembler à ceci.

Après avoir entré les données de connexion, vous êtes automatiquement redirigé vers la page http://127.0.0.1:8000/accounts/profile/. Ce n’est pas ce que nous voulons.

Pour ne pas atterrir sur la page des profils, on change la redirection vers la page d’accueil. Pour cela on ajoute dans le fichier de configuration du projet la ligne suivante :

LOGIN_REDIRECT_URL = 'home'

Il faut ensuite revenir à la page, se déconnecter en cliquant sur le lien Déconnexion.

Vous serez alors redirigés vers la page de déconnexion par défaut du portail d’administration Django à l’adresse http://127.0.0.1:8000/accounts/logout/.

Comme vous pouvez le voir, la langue par défaut dans notre projet est l’anglais. De ce fait, le portail d’administration et les templates par défaut contenant un formulaire, un message ou des instructions sont en langue anglaise. On peut évidemment définir la langue de notre choix dans le fichier de configuration en modifiant la valeur de LANGUAGE_CODE comme ceci :

LANGUAGE_CODE = 'fr-fr'

Rafraichissez la page de déconnexion pour vous assurer que celle-ci est bien dans la langue désirée.

Nous pouvons maintenant tester une seconde fois la page de connexion. Allez dans la page d’accueil et cliquez sur Connexion. Dans la page de connexion, entrez vos identifiants et cliquez sur le bouton Se connecter. Vous devriez être redirigé vers la page d’accueil.

Personnaliser la page de déconnexion

Comme nous venons de l’observer plus haut, la page de déconnexion par défaut est liée au portail d’administration. Nous allons modifier cette page, en redéfinissant le template ainsi que l’url associés à la vue de déconnexion LogoutView.

Définir le template de déconnexion

Commençons par le template qui comportera les lignes suivantes :

{% extends "base.html" %}
{% block content %}
<h2>Vous êtes déconnecté. </h2>
    <a href="{% url 'login' %}">Se reconnecter</a>
{% endblock %}

Redéfinir le chemin vers la page de déconnexion

Nous devons ensuite ajouter dans la liste urlpatterns le chemin vers la page de déconnexion, comme montrée ci-dessous (en ligne 6).

...
urlpatterns =[
	
	path('accounts/', include('django.contrib.auth.urls')),
	path('login/', auth_views.LoginView.as_view(template_name='registration/login.html'), name = 'login'),	
	path('logout/', auth_views.LogoutView.as_view(template_name='registration/logout.html'), name = 'logout'),
]

Test la page de déconnexion

On peut maintenant tester la page de déconnexion.

Gérer les permissions

Dans cette dernière section, voyons comment on peut gérer la sécurité des accès aux données. Nous allons apporter les modifications nécessaires à notre vue home() pour qu’elle n’affiche que les notes de la personne authentifiée. Cela veut dire qu’il faut être connecté en premier lieu pour accéder à la page d’accueil et lister ses propres notes. Pour ce faire, on importe ce qu’on appelle un décorateur (“decorator” en anglais), comme cela est montré en ligne 3, puis on l’inscrit juste avant la fonction à modifier (ligne 5).

from django.shortcuts import render
from mynotesapp.models import Note
from django.contrib.auth.decorators import login_required

@login_required
def home(request):
	context ={
	'notes': Note.objects.filter(author=request.user)
	}
	return render(request, 'home.html',context)

INFO Les décorateurs de vue sont des fonctions fournies par le Framework Django qui permettent de modifier une fonction ou d’ajouter à celle-ci d’autres fonctionnalités.

Dans le cas présent nous utiliserons un décorateur d’authentification login_required qui va sécuriser et restreindre l’accès à la page d’accueil selon qu’un utilisateur est authentifiée ou non. Ainsi, si un utilisateur tente d’accéder à la page d’accueil pour la première fois, il sera automatiquement redirigé vers la page de connexion, dont l’url LOGIN_URL est définie dans le fichier de configuration settings.py.

En d’autres termes, avec ce décorateur l’utilisateur est forcé de s’authentifier pour accéder à ses notes au niveau de la page d’accueil.

Une fois authentifié, l’utilisateur est redirigé vers la page d’accueil et peut accéder à ses notes seulement. Cette restriction dans l’affichage des notes est réalisée à l’aide de la fonction filter(author=request.user) appliquée aux objets Note (ligne 8) et on limite ainsi la liste des notes à celles écrites par l’utilisateur connecté.

Conclusion

Dans cette première partie du tutoriel consacrée à la mise en place d’un système d’authentification dans une application web Django, nous avons vu comment construire les pages de connexion et de déconnexion. Nous avons montré comment limiter l’accès aux données et gérer les permissions à l’aide de décorateurs. Dans le prochain article de la série, nous opérerons de manière similaire pour le système de réinitialisation de mot de passe. Enfin, si vous avez des questions concernant ce premier article, je serais ravie d’y répondre en commentaires.