Guide complet du module d'authentification et de l'extension du modèle utilisateur dans Django

Architecture du module d'authentification Django

Le framework Django intègre nativement un système robuste via le module django.contrib.auth. Ce composant gère l'authentification, les autorisations et les sessions en s'appuyant par défaut sur la table auth_user. Il permet de créer des superutilisateurs disposant de tous les droits d'daministration et facilite la gestion des identités.

Pour interagir avec ce système, les imports suivants sont nécessaires :

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

Gestion du cycle de vie des utilisateurs

Création de comptes

L'inscription des utilisateurs doit se faire via les méthodes dédiées du gestionnaire d'objets pour garantir que les mots de passe soient correctement hachés avant l'insertion en base de données.

# Création standard avec hachage du mot de passe (Recommandé)
User.objects.create_user(username='johndoe', password='secure_password_123')

# Création d'un superutilisateur (nécessite un email valide)
User.objects.create_superuser(username='admin', email='admin@example.com', password='admin_pass')

Note : L'utilisation de User.objects.create() est déconseillée car elle stocke le mot de passe en clair.

Authentification et établissement de session

La validation des identifiants et la création de la session se font en deux étapes distinctes. La fonction authenticate vérifie les crédits, tandis que login attache l'utilisateur à la session courante.

from django.shortcuts import render, redirect
from django.http import HttpResponseBadRequest

def process_user_login(request):
    if request.method == 'POST':
        login_identifier = request.POST.get('login_id')
        raw_password = request.POST.get('raw_password')

        # Vérification des identifiants
        authenticated_user = auth.authenticate(
            request, 
            username=login_identifier, 
            password=raw_password
        )

        if authenticated_user is not None:
            # Attachement de l'utilisateur à la session (crée le cookie de session)
            auth.login(request, authenticated_user)
            return redirect('dashboard')
        
        return HttpResponseBadRequest("Identifiants invalides.")

    return render(request, 'authentication/login_form.html')

Vérification de l'état de connexion

Une fois la session établie, l'intergiciel d'authentification injecte l'objet utliisateur dans la requête. Dans les versions modernes de Django, is_authenticated est une propriété et non une méthode.

# Vérification de l'état
if request.user.is_authenticated:
    current_user = request.user
    # Traitement des données de l'utilisateur connecté

Déconnexion

La déconnexion invalide la session courante et nettoie les données de session associées.

from django.contrib.auth.decorators import login_required

@login_required
def process_user_logout(request):
    auth.logout(request)
    return redirect('home_page')

Contrôle d'accès et sécurité

Restriction d'accès par décorateur

Le décorateur @login_required intercepte les requêtes non authentifiées et les redirige vers la page de connexion. La redirection peut être configurée localement ou globalement.

from django.contrib.auth.decorators import login_required

# Configuration locale (prioritaire)
@login_required(login_url='/accounts/login/')
def view_restricted_content(request):
    return render(request, 'secure/dashboard.html')

# Configuration globale (dans settings.py)
# LOGIN_URL = '/accounts/login/'
@login_required
def view_another_restricted_page(request):
    return render(request, 'secure/profile.html')

Modification du mot de passe

La mise à jour du mot de passe nécessite d'abord la validation de l'ancien secret, suivie de l'application du nouveau et de la persistance en base.

def update_user_credentials(current_user, legacy_pwd, fresh_pwd):
    if current_user.check_password(legacy_pwd):
        current_user.set_password(fresh_pwd)
        current_user.save()  # Persistance obligatoire pour mettre à jour le hash
        return True
    return False

Personnalisation du modèle utilisateur

Lorsque les champs par défaut de auth_user sont insuffisants, il est possible d'étendre le modèle. L'approche recommandée consiste à hériter de AbstractUser, ce qui conserve toutes les fonctionnalités natives tout en permettant l'ajout de colonnes personnalisées.

Définition du modèle étendu

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

class MemberProfile(AbstractUser):
    mobile_number = models.CharField(max_length=20, blank=True, null=True)
    profile_picture = models.ImageField(upload_to='avatars/', blank=True, null=True)
    is_premium_member = models.BooleanField(default=False)

    class Meta:
        verbose_name = "Membre"
        verbose_name_plural = "Membres"

    def __str__(self):
        return f"{self.username} - {self.mobile_number}"

Configuration de l'application

Pour que Django utilise cette nouvelle table à la place de auth_user, il est impératif de déclarer le modèle personnalisé dans le fichier de configuration principal. Cette modification doit être effectuée avant la première migration de la base de données.

# settings.py
AUTH_USER_MODEL = 'accounts.MemberProfile'

Une fois cette configuration appliquée, le module auth continuera de fonctionner de manière transparente, mais toutes les opérations de base de données et les relations de clés étrangères pointeront vers la table MemberProfile.

Étiquettes: Django Authentification abstractuser modele-utilisateur Sécurité-Web

Publié le 2 juillet à 21h26