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
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.
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_passwordetcheck_password).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.