Prezentare generală

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:

  • Utilizatori
  • Permisiuni: Binary (yes/no) flags care desemnează dacă un utilizator poate efectua un anumit task.
  • Grupuri: Un mod generic de a aplica “etichete” și permisiuni mai multor utilizatori în același timp.
  • Un sistem configurabil de hashing pentru parole.
  • Formulare și view-uri pentru autentificarea utilizatorilor.

Instalare

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):

  1. ‘django.contrib.auth’ conține nucleul framework-ului de autentificare și modelele lui predefinite (în proiectul nostru îl găsiți aici).
  2. ‘django.contrib.contenttypes’ este content type system-ul Django, ce permite permisiunilor să poată fii asociate cu modele pe care le-ați creat (în proiectul nostru îl găsiți aici).

și din elementele enumerate în MIDDLEWARE:

  1. SessionMiddleware gestionează sesiunile pe request-uri (în proiectul nostru îl găsiți aici).
  2. AuthenticationMiddleware asociază utilizatorii cu requesturile lor folosind sesiuni (în proiectul nostru îl găsiți aici).

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.

Lucrul cu obiectele de tip User

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:

  1. username
  2. password
  3. email
  4. first_name
  5. last_name

Mai multe detalii despre modelul User aici

Crearea unui utilizator

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()

Crearea unui superuser

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.

Schimbarea parolei

Există mai multe opțiuni pentru schimbarea parolei:

  1. 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.

  2. 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()

Permisiuni și autorizare

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ă:

  1. Accesul pentru a vedea formularul “add” și pentru a adaugă un obiect este limitat la utilizatorii cu permisiuni “add” pentru acel tip de obiect.
  2. Accesul pentru a vizualiza lista change, pentru a vizualiza formularul “change” și de a schimba un obiect este limitat la utilizatorii cu permisiunea “change” pentru acel tip de obiect.
  3. Accesul pentru a șterge un obiect este limitat la utilizatorii cu permisiunea “delete” pentru acel tip de obiect.

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.

How to log a user in

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

How to log a user out

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.

Decoratorul login_required

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    ...

Decoratorul login_required() face următoarele lucruri:

  • Dacă utilizatorul nu este logat, îl redirectează către settings.LOGIN_URL, trimițând calea absolută curentă. Exemplu: /accounts/login/?next=/polls/3/.
  • Dacă utilizatorul este logat, execută view-ul în mod normal. Codul view-ului poate să presupună că utilizatorul este logat.

Mai multe detalii despre autentificare și administrarea utilizatorilor în Django aici.