Système d'authentification dans Django

Présentation du module d'authentification

Le module d'authentification intégré à Django fournit une solution complète pour gérer les utilisateurs de votre application web. Il permet de mettre en place des fonctionnalités essentielles telles que l'inscription, la connexion, la vérification d'identité, la déconnexion et la modification du mot de passe, sans avoir à concevoir ces composants manuellement.

Django utilise automatiquement une table nommée auth_user pour stocker les informations des utilisateurs. Cette table est créée par défaut lors de la configuraton initiale du projet.

# Création d'un superutilisateur via la ligne de commande
python3 manage.py createsuperuser

Ce système évite la nécessité de créer une table utilisateur personnalisée dès le départ.

Méthodes principales du module d'authentification

Pour accéder aux fonctions d'authentification, il faut importer :

from django.contrib import auth

  • authenticate() : Vérifie si les identifiants (nom d'utilisateur et mot de passe) sont corrects. Retourne un objet User si la validation réussit.
  • login(request, user) : Démarre une session pour l'utilisateur après authentification. Stocke les données de session côté serveur.
  • logout(request) : Supprime toutes les données de session liées à l'utilisateur courant. Ne provoque pas d'erreur même si l'utilisateur n'est pas connecté.
  • is_authenticated : Propriété disponible sur l'objet request.user pour détecter si l'utilisateur est connecté.
  • login_required : Décorateur qui protège les vues en exigeant une authentification. Redirige vers une URL de login si nécessaire.
  • create_user() : Méthode pour créer un nouvel utilisateur standard.
  • create_superuser() : Méthode pour créer un administrateur avec tous les droits.
  • check_password(password) : Vérifie si un mot de passe fourni correspond à celui de l'utilisateur.
  • set_password(new_password) : Modifie le mot de passe. Obligatoire de sauvegarder l'objet utilisateur après modification.

Exemple d'utilisation de set_password

@login_required(login_url='/login/')
def modifier_mot_de_passe(request):
    if request.method == 'POST':
        ancien = request.POST.get('ancien')
        nouveau = request.POST.get('nouveau')
        confirmation = request.POST.get('confirmation')

        if not request.user.check_password(ancien):
            return HttpResponse("Ancien mot de passe incorrect.")

        if nouveau != confirmation:
            return HttpResponse("Les nouveaux mots de passe ne correspondent pas.")

        request.user.set_password(nouveau)
        request.user.save()
        return redirect('/login/')

    return render(request, 'modifier.html')

Attributs clés de l'objet User

  • username : Identifiant unique de l'utilisateur.
  • password : Mot de passe chiffré.
  • is_staff : Indique si l'utilisateur a accès au panneau d'administration.
  • is_active : Permet ou interdit la connexion. Utile pour suspendre temporairement un compte.

Extension de la table auth_user

La table par défaut est fixe. Pour ajouter des champs personnalisés comme un numéro de téléphone, deux approches sont possibles :

  1. Relation OneToOne : Créer une table secondaire liée à auth_user.
  2. Héritage depuis AbstractUser : Définir un modèle personnalisé qui étend AbstractUser.

Exemple d'héritage :

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

class CustomUser(AbstractUser):
    phone = models.CharField(max_length=15, unique=True, null=True)

    def __str__(self):
        return self.username

Dans le fichier settings.py, indiquer à Django d'utiliser ce modèle :

AUTH_USER_MODEL = 'monapp.CustomUser'

⚠️ Important : Une fois cette configuraton activée, il faut supprimer la base de données existante et régénérer les migrations. Les anciennes tables ne peuvent plus être utilisées.

Architecture complète

Voici un exemple complet combinant :

  • Héritage de AbstractUser
  • Authentification basique
  • Modification de mot de passe
  • Gestion des permisssions administrateur

Les fichiers HTML incluent des interfaces Bootstrap pour la navigation, la connexion, l’inscription et la gestion des utilisateurs. Le backend Python implémente des vues sécurisées avec décorateurs @login_required et des contrôles rigoureux sur les entrées.

Les URLs sont configurées pour mapper chaque action à une vue spécifique.

Étiquettes: Django authentication user model abstractuser login_required

Publié le 20 octobre à 04h20