Vue d'ensemble
Django 1.9, publié le 1er décembre 2015, renforce la sécurité des applications grâce à un système de validation des mots de passe configurable. Cette version permet de définir des règles de complexité pour les mots de passe utilisateurs et ajoute des améliorations dans les templates avec les expressions conditionnelles.
Fonctionnalités principales
Validation des mots de passe
Le réglage AUTH_PASSWORD_VALIDATORS définit une liste de validateurs appliqués automatiquement lors de la création ou la modification d'un mot de passe. Django fournit des validateurs intégrés et permet d'en créer de personnalisés.
# settings.py
AUTH_PASSWORD_VALIDATORS = [
{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'},
{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {'min_length': 10}},
{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator'},
{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator'},
]
# Validateur personnalisé
from django.core.exceptions import ValidationError
class ValidateurCaracteresSpeciaux:
"""Exige au moins un caractère spécial."""
def validate(self, password, user=None):
caracteres_speciaux = set('!@#$%^&*()_+-=[]{}|;:,.<>?')
if not any(c in caracteres_speciaux for c in password):
raise ValidationError(
'Le mot de passe doit contenir au moins un caractère spécial.',
code='no_special_char',
)
def get_help_text(self):
return 'Le mot de passe doit contenir au moins un caractère spécial.'
Expressions conditionnelles dans les templates
Les validateurs de mots de passe s'accompagnent de widgets améliorés dans les formulaires. Par ailleurs, les mixin de permissions dans les vues basées sur les classes sont ajoutés avec LoginRequiredMixin, PermissionRequiredMixin et UserPassesTestMixin.
from django.contrib.auth.mixins import (
LoginRequiredMixin,
PermissionRequiredMixin,
)
from django.views.generic import ListView, CreateView
class ListeDocuments(LoginRequiredMixin, ListView):
"""Accessible uniquement aux utilisateurs connectés."""
model = Document
template_name = 'documents/liste.html'
login_url = '/connexion/'
class CreerRapport(PermissionRequiredMixin, CreateView):
"""Nécessite la permission 'rapports.add_rapport'."""
model = Rapport
fields = ['titre', 'contenu']
permission_required = 'rapports.add_rapport'
