00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

Sistema di Autenticazione

Django include un sistema di autenticazione completo e pronto all’uso che gestisce utenti, password, gruppi e permessi. Questo sistema e uno dei punti di forza del framework e copre la maggior parte delle esigenze di autenticazione senza dover ricorrere a librerie esterne.

Configurazione Iniziale

Il sistema di autenticazione e incluso di default nei nuovi progetti Django. Verifica che queste app siano presenti in INSTALLED_APPS:

# settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',           # sistema di autenticazione
    'django.contrib.contenttypes',   # framework dei content types
    'django.contrib.sessions',       # gestione delle sessioni
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',  # obbligatorio
    'django.contrib.messages.middleware.MessageMiddleware',
]

Il middleware AuthenticationMiddleware associa l’utente corrente a ogni richiesta tramite request.user.

Il Modello User

Il modello User predefinito di Django include i seguenti campi principali:

from django.contrib.auth.models import User

# Campi principali del modello User:
# - username: nome utente univoco
# - password: hash della password
# - email: indirizzo email
# - first_name: nome
# - last_name: cognome
# - is_active: se l'account e attivo
# - is_staff: se puo accedere all'admin
# - is_superuser: se ha tutti i permessi
# - date_joined: data di registrazione
# - last_login: ultimo accesso

Creare e Gestire Utenti

Puoi creare utenti tramite il codice Python:

from django.contrib.auth.models import User

# Creare un utente normale
utente = User.objects.create_user(
    username='mario',
    email='mario@esempio.it',
    password='password_sicura123'
)

# Creare un superuser
admin = User.objects.create_superuser(
    username='admin',
    email='admin@esempio.it',
    password='admin_password123'
)

# Modificare un utente
utente.first_name = 'Mario'
utente.last_name = 'Rossi'
utente.save()

# Cambiare la password
utente.set_password('nuova_password')
utente.save()

# Verificare una password
utente.check_password('nuova_password')  # restituisce True o False

Accedere all’Utente Corrente

In ogni view, l’utente corrente e disponibile tramite request.user:

from django.http import HttpResponse

def profilo(request):
    if request.user.is_authenticated:
        return HttpResponse(f"Benvenuto, {request.user.username}!")
    else:
        return HttpResponse("Non sei autenticato.")

Nei template, l’oggetto user e disponibile automaticamente:

# {% if user.is_authenticated %}
#     <p>Ciao, {{ user.username }}!</p>
# {% else %}
#     <p><a href="{% url 'login' %}">Accedi</a></p>
# {% endif %}

Backend di Autenticazione

Django utilizza i backend di autenticazione per verificare le credenziali. Il backend predefinito e ModelBackend:

# settings.py
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
]

Puoi creare un backend personalizzato, ad esempio per autenticare tramite email:

# backends.py
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model

User = get_user_model()

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = User.objects.get(email=username)
        except User.DoesNotExist:
            return None
        if user.check_password(password):
            return user
        return None
# settings.py
AUTHENTICATION_BACKENDS = [
    'myapp.backends.EmailBackend',
    'django.contrib.auth.backends.ModelBackend',
]

AUTH_USER_MODEL

Se prevedi di usare un modello utente personalizzato, definisci AUTH_USER_MODEL nelle impostazioni prima di eseguire le migrazioni:

# settings.py
AUTH_USER_MODEL = 'accounts.CustomUser'

Per riferirsi al modello utente nel codice, usa sempre get_user_model():

from django.contrib.auth import get_user_model

User = get_user_model()
utenti_attivi = User.objects.filter(is_active=True)

Hashing delle Password

Django gestisce automaticamente l’hashing delle password. Non salvare mai password in chiaro:

# settings.py - configurazione degli hasher (opzionale)
PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
]

Il primo hasher nella lista e quello usato per le nuove password. Gli altri servono per verificare password esistenti.

Conclusione

Il sistema di autenticazione di Django fornisce una base solida per la gestione degli utenti. Con il modello User, i backend personalizzabili e la gestione sicura delle password, copre la maggior parte degli scenari di autenticazione. Nei prossimi capitoli vedremo come implementare login, logout, registrazione e gestione dei permessi.