Nouveau : Datasets open source gratuits disponibles !Decouvrir →
🔐
Intermediaire 25 min Django

Authentification dans Django

Pourquoi Authentification dans Django ?

L'authentification est un élément fondamental en développement web, car elle permet de sécuriser les ressources et les données d'un site ou d'une application. Elle est essentielle pour protéger les utilisateurs contre l'accès non autorisé et la manipulation des données sensibles.

Un cas concret : Imaginez une plateforme de gestion des projets où différents utilisateurs peuvent créer, modifier et supprimer des tâches. Pour que cette application soit sécurisée, il est impératif d'implémenter un système d'authentification permettant aux utilisateurs de s'identifier et de bénéficier des droits appropriés.

Prerequis

  • Connaissances en Python
  • Familiarité avec Django
  • Connaissance de bases du HTML/CSS pour la création d'interfaces utilisateur
  • Installation de Python (version recommandée : 3.8 ou supérieure)
  • Installation de pip (généralement inclus avec l'installation de Python)

Concepts fondamentaux

1. Utilisateurs et Groupes

Django fournit un système robuste pour gérer les utilisateurs et les groupes.

## models.py
from django.contrib.auth.models import User, Group

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(blank=True)

    def __str__(self):
        return self.user.username

2. Authentification Forms

Django fournit des formulaires prédéfinis pour la connexion et l'enregistrement d'utilisateurs.

## forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm

class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

class CustomAuthenticationForm(AuthenticationForm):
    pass

3. Middleware d'Authentification

Le middleware authentifie les utilisateurs pour chaque requête.

## settings.py
MIDDLEWARE = [
    ...
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    ...
]

4. Vues d'authentification

Django fournit des vues prédéfinies pour la gestion de l'authentification.

## urls.py
from django.urls import path
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]

Mise en pratique : projet fil rouge

Nous allons créer une application simple de gestion des utilisateurs qui permet aux utilisateurs de s'inscrire, se connecter et afficher leurs profils.

Étape 1 : Initialiser le Projet Django

django-admin startproject user_management
cd user_management

Étape 2 : Créer une Application

python manage.py startapp accounts

Étape 3 : Configurer les Modèles

## accounts/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    bio = models.TextField(blank=True)
    birth_date = models.DateField(null=True, blank=True)

    def __str__(self):
        return self.username

Migrer le modèle :

python manage.py makemigrations accounts
python manage.py migrate

Étape 4 : Créer les Formulaires

## accounts/forms.py
from django import forms
from .models import CustomUser

class UserCreationForm(forms.ModelForm):
    class Meta:
        model = CustomUser
        fields = ('username', 'email', 'password1', 'password2', 'bio', 'birth_date')

class UserUpdateForm(forms.ModelForm):
    class Meta:
        model = CustomUser
        fields = ('username', 'email', 'bio', 'birth_date')

Étape 5 : Créer les Vues

## accounts/views.py
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from .forms import UserCreationForm, UserUpdateForm
from django.contrib.auth import login, authenticate

def signup(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=user.username, password=raw_password)
            login(request, user)
            return redirect('home')
    else:
        form = UserCreationForm()
    return render(request, 'signup.html', {'form': form})

@login_required
def profile(request):
    if request.method == 'POST':
        u_form = UserUpdateForm(request.POST, instance=request.user)

        if u_form.is_valid():
            u_form.save()
            messages.success(request, f'Your account has been updated!')
            return redirect('profile')

    else:
        u_form = UserUpdateForm(instance=request.user)

    context = {
        'u_form': u_form
    }

    return render(request, 'profile.html', context)

Étape 6 : Configurer les URLs

## accounts/urls.py
from django.urls import path
from .views import signup, profile

urlpatterns = [
    path('signup/', signup, name='signup'),
    path('profile/', profile, name='profile'),
]

Inclure les URL de l'application dans le fichier urls.py principal :

## user_management/urls.py
from django.contrib import admin
from django.urls import path, include

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

Étape 7 : Créer les Templates

Créer le template signup.html :

<!-- accounts/templates/accounts/signup.html -->
{% extends 'base.html' %}

{% block content %}
<h2>S'inscrire</h2>
<form method="post">
    {% csrf_token %}
    form.as_p
    <button type="submit">S'inscrire</button>
</form>
{% endblock %}

Créer le template profile.html :

<!-- accounts/templates/accounts/profile.html -->
{% extends 'base.html' %}

{% block content %}
<h2>Profil</h2>
<form method="post">
    {% csrf_token %}
    u_form.as_p
    <button type="submit">Mettre à jour</button>
</form>
{% endblock %}

Erreurs frequentes et debugging

1. AttributeError: 'User' object has no attribute 'bio'

Code incorrect :

## views.py
def profile(request):
    user = request.user
    bio = user.bio
    # ...

Code correct :

## views.py
def profile(request):
    user = request.user
    if hasattr(user, 'profile'):
        bio = user.profile.bio
    else:
        bio = None
    # ...

2. NoReverseMatch at /accounts/signup/ Reverse for 'signup' not found

Code incorrect :

## urls.py
from django.urls import path
from .views import signup

urlpatterns = [
    path('signup/', signup, name='signin'),
]

Code correct :

## urls.py
from django.urls import path
from .views import signup

urlpatterns = [
    path('signup/', signup, name='signup'),
]

3. Invalid form submission

Code incorrect :

<!-- signup.html -->
<form method="post">
    {% csrf_token %}
    form.as_p
    <button type="submit">S'inscrire</button>
</form>

Code correct :

<!-- signup.html -->
<form method="post">
    {% csrf_token %}
    form.as_p
    <button type="submit">S'inscrire</button>
</form>

Pour aller plus loin

  1. Gestion des rôles et permissions : En apprenant à utiliser les groupes et les permissions dans Django, vous pouvez contrôler davantage l'accès aux différentes parties de votre application.

  2. Utilisation d'un système de mots de passe fort : Pour améliorer la sécurité de votre application, utilisez un système de mots de passe fort en intégrant les fonctions fournies par Django pour cela (par exemple, make_password et check_password).

  3. Sécurité des formulaires : Assurez-vous que tous vos formulaires sont sécurisés contre les attaques CSRF et d'injection SQL.

Défi pratique

Implémentez une fonctionnalité permettant à un utilisateur de modifier son mot de passe. Utilisez le formulaire PasswordChangeForm fourni par Django pour cette tâche.

## accounts/views.py
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import PasswordChangeForm

@login_required
def change_password(request):
    if request.method == 'POST':
        form = PasswordChangeForm(request.user, request.POST)
        if form.is_valid():
            user = form.save()
            update_session_auth_hash(request, user)  # Important !
            messages.success(request, 'Votre mot de passe a été mis à jour avec succès.')
            return redirect('profile')
    else:
        form = PasswordChangeForm(request.user)
    return render(request, 'change_password.html', {'form': form})

Ajoutez la URL et le template pour cette vue :

## accounts/urls.py
from django.urls import path
from .views import signup, profile, change_password

urlpatterns = [
    path('signup/', signup, name='signup'),
    path('profile/', profile, name='profile'),
    path('change-password/', change_password, name='change_password'),
]
html
<!-- accounts/templates/accounts/change_password.html -->
{% extends 'base.html' %}

{% block content %}
<h2>Changer de mot de passe</h2>
<form method="post">
    {% csrf_token %}
    form.as_p
    <button type="submit">Mettre à jour</button>
</form>
{% endblock %}

Avec ces étapes, vous avez créé une application Django simple et sécurisée pour la gestion des utilisateurs. Vous pouvez maintenant approfondir vos compétences en authentification et sécurité avec Django.

Besoin d'aide sur Django ?

Besoin d'aide sur un projet technique ? Decrivez-le pour des conseils personnalises.

Recevoir des conseils

Questions frequentes

Quelle est la différence entre les méthodes authenticate() et login() dans Django?
authenticate() vérifie les informations d'identification fournies (généralement le nom d'utilisateur et le mot de passe) et renvoie un objet User s'ils sont corrects. login() crée une session pour l'utilisateur authentifié.
Comment puis-je protéger mon formulaire de connexion contre les attaques CSRF?
Pour protéger votre formulaire de connexion contre les attaques CSRF, vous devez utiliser le tag csrf_token fourni par Django dans votre template. Assurez-vous d'inclure ce tag dans votre formulaire.
Comment puis-je créer une page de login personnalisée avec Django?
Pour créer une page de login personnalisée, vous devez créer une vue qui utilise le formulaire de connexion fourni par Django. Ensuite, créez un template HTML pour cette vue et assurez-vous d'inclure le tag csrf_token dans votre formulaire.

Pages liees

Chaque semaine, le meilleur de la tech francaise

Tendances, salaires, outils et opportunites — directement dans votre boite mail.

Gratuit. Desabonnement en un clic. Pas de spam.