Sistemul de autentificare Django se ocupă atât de autentificare cât și de autorizare. Pe scurt, autentificarea verifică dacă un utilizator este cine pretinde a fi și autorizare determină ce un utilizator autentificat este permis să facă. În acest caz, termenul de autentificare este folosit pentru a se referi la ambele sarcini.
Auth system (authentication and authorization) este alcătuit din:
Suportul de autentificare este livrat ca un modulul contrib Django în django.contrib.auth. În mod implicit, configurația necesară este deja inclusă în settings.py generat de django-admin startproject, acestea sunt formate din două elemente enumerate în INSTALLED_APPS (în fișierul settings.py):
și din elementele enumerate în MIDDLEWARE:
Odată ce aceste setări au fost configurate, la rularea comenzii manage.py migrate se crează în baza de date tabelele necesare pentru modelele asociate și permisiuni pentru orice model definit în INSTALLED_APPS.
Obiectele de tip User sunt nucleul sistemului de autentificare. Doar o singură clasă User există în framework-ul de autentificare a lui Django, adică utilizatorii ‘superuser’ sau ‘staff’ sunt doar obiecte utilizator cu atribute speciale stabilite, nu diferite clase.
Atributele primare ce există în mod implicit pentru un User sunt:
Mai multe detalii despre modelul User aici
Cel mai direct mod în care se poate crea un utilizator include folosirea funcției create_user():
>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
# At this point, user is a User object that has already been saved
# to the database. You can continue to change its attributes
# if you want to change other fields.
>>> user.last_name = 'Lennon'
>>> user.save()
Putem crea un superuser folosind comanda createsuperuser:
$ python manage.py createsuperuser --username=joe --email=joe@example.com
Vi se va cere o parolă. După ce ați introdus una, utilizatorul va fi creat imediat. Dacă nu folosiți opțiunile –username sau –email, vă va solicita aceste valori.
Există mai multe opțiuni pentru schimbarea parolei:
Folosind comanda manage.py changepassword username oferă o metodă de schimbare a parolei utilizatorului folosind linia de comandă. Vă solicită să schimbați parola unui anumit utilizator, parolă pe care trebuie să o introduceți de două ori. În cazul în care ambele se potrivesc, noua parola va fi schimbată imediat.
De asemenea, aveți posibilitatea să modificați o parolă folosind set_password():
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()
Django vine cu un sistem de permisiuni simplu. Acesta oferă o modalitate de a atribui permisiuni utilizatorilor și grupuri de utilizatori.
Site-ul admin Django utilizează permisiunile după cum urmează:
Permisiunile pot fi setate nu doar pentru un tip de obiect, dar și pentru o instanță specifică a unui obiect. Folosind metodele has_add_permission(), has_change_permission() și has_delete_permission() din clasa ModelAdmin este posibil să modifici permisiunile pentru diferite intstanțe ale unui aceluiași obiect.
Mai multe detalii despre permisiuni aici.
Pentru a conecta un utilizator, dintr-un view, utilizați login(). Aceasta folosește un obiect HttpRequest și un obiect User. login() salvează ID-ul utilizatorului în cadrul sesiunii, folosind framework-ul de sesiune din Django.
Exemplu:
from django.contrib.auth import authenticate, login
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
# Redirect to a success page.
...
else:
# Return an 'invalid login' error message.
...
Pentru a deloga un utilizator folosiți metoda django.contrib.auth.logout() în view-ul dorit. Folosește un obiect de tip HttpRequest și nu returnează nicio valoare.
Exemplu:
from django.contrib.auth import logout
def logout_view(request):
logout(request)
# Redirect to a success page.
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
...
Decoratorul login_required() face următoarele lucruri:
Mai multe detalii despre autentificare și administrarea utilizatorilor în Django aici.