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.