Autoryzacja i uwierzytelnianie w Django

Django posiada wbudowany, rozbudowany system zarządzania użytkownikami, logowaniem i uprawnieniami. Dzięki niemu można szybko tworzyć aplikacje z rejestracją użytkowników, kontrolą dostępu i autoryzacją akcji.


1. System użytkowników w Django

Django domyślnie dostarcza model User (django.contrib.auth.models.User) z polami:

  • username, password, email,
  • first_name, last_name,
  • is_staff, is_superuser, is_active,
  • last_login, date_joined.

System obsługuje:

  • rejestrację i logowanie,
  • autoryzację (czy użytkownik ma prawo wykonać daną akcję),
  • grupy i uprawnienia,
  • zarządzanie hasłami (hashowanie, reset, zmiana).

Aby włączyć go w projekcie, upewnij się, że w settings.py znajdują się:


2. Logowanie, wylogowanie, rejestracja

Logowanie (views.py)

Django udostępnia wbudowaną funkcję authenticate() oraz login():

Wylogowanie (views.py)

Rejestracja użytkownika (views.py)

Można ją zaimplementować samodzielnie albo użyć UserCreationForm:

Szablon logowania (login.html):


3. Ograniczanie dostępu (login_required, permissions)

1. Dekorator login_required

Używany do ograniczenia dostępu do widoków:

Jeśli użytkownik nie jest zalogowany, zostanie przekierowany na stronę logowania (settings.LOGIN_URL, domyślnie /accounts/login/).

2. Sprawdzanie uprawnień (permissions)

Każdy model w Django dostaje automatycznie podstawowe uprawnienia: add, change, delete, view.

Możemy sprawdzać je w widoku:

3. Grupy użytkowników

W panelu admina można tworzyć grupy i przypisywać im uprawnienia. Użytkownik przypisany do grupy dziedziczy jej uprawnienia.


4. Rozszerzanie modelu użytkownika

Domyślny model User jest często niewystarczający (np. brakuje pola avatar). Django umożliwia różne sposoby rozszerzania użytkownika:

1. Profil użytkownika – OneToOneField

Tworzymy dodatkowy model powiązany z User:

Zwykle łączy się go z sygnałami (signals.post_save), aby profil tworzył się automatycznie po rejestracji użytkownika.

2. Własny model użytkownika (AbstractUser)

Najbardziej elastyczne podejście – tworzymy własny model dziedziczący po AbstractUser:

W settings.py ustawiamy:

Uwaga: zmianę AUTH_USER_MODEL należy ustawić na początku projektu, przed wykonaniem migracji – późniejsza zmiana jest trudna.