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.

python
# 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.

python
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'

Sources