Python Django, to jeden z najpopularniejszych frameworków do tworzenia stron i aplikacji internetowych. By framework był konkurencyjny, musi być jak najbardziej kompleksowy, czyli dostarczać jak najwięcej wbudowanych funkcji. I jedną z takich funkcji jest system zarządzania użytkownikami, grupami oraz prawami dostępu do określonych miejsc.

System zarządzania użytkowników znajduje się w pliku konfiguracyjnym settings.py w tablicy INSTALLED_APS: ‘django.contrib.auth’. System zarządzania użytkownikami ma szereg pól, metod oraz widoków.

Pola

Użytkownicy w Django to najzwyklejszy djangowy model, który możemy wywołać z django/contrib/auth/models.py/User. Sama klasa User ma następujące pola:

  • username – username naszego użytkownika
  • first_name – pierwsze imię użytkownika, pole opcjonalne
  • last_name – drugie imię użytkownika, pole opcjonalne
  • email – pole maila, pole opcjonalne
  • password – hasło użytkownika, pole wymagane -> posiada hash i metadane
  • is_staff – czy użytkownik należy do administracji, czyt. ma dostęp do panelu administracyjnego, pole boolean: true, false
  • is_active – czy konto jest aktywne, czy konto zostało aktywowane i może się zalogować do systemy, ale nie do pola admina, pole boolean: true, false
  • is_superuser – czy konto jest super administratorem, posiada wszystkie uprawnienia, pole boolean: true, false
  • last_login – data ostatniego logowania
  • date_joined – data rejestracji w systemie

Metody

Klasa user ma dwa pola: many to many: groups i user_permissions. Zarządzanie grupami i prawami dostępu użytkowników. Wywoływanie tych metod jest proste: User.objects.permission.add(group, group, …).

Obiekt User ma jeszcze kilka metod:

  • is_anonymous() – służy do sprawdzenia czy nasz użytkownik to User lub AnonymousUser.  Nie zaleca się tego używać
  • is_authenticated() – zwraca Prawdę (True) jeśli użytkownik jest zalogowany, Fałsz (False) jeśli nie
  • get_full_name() – zwraca pełną nazwę użytkownika wg wzoru “Imię Nazwisko”
  • set_password(haslo) – ustawia i haszuje hasło, ważne: to hasło nie jest jeszcze zapisane w bazie danych
  • check_password(haslo) – zwraca true / false jeśli hasło jest poprawnym hasłem użytkownika
  • get_profile() – zwraca profil użytkownika
  • email_user() – wysyła email do użytkownika
  • get_group_permissions() – zwraca listę uprawnień jaką posiada użytkownik z danej grupy
  • get_all_permissions() – zwraca listę wszystkich uprawnień

Menedżer

  • create_user(username, email, password) – tworzymy użytkownika
  • make_random_password() – zwraca losowe hasło

Proste przykłady

Tworzymy użytkownika:

from django.contrib.auth.models import User
user =User.objects.create_user('jan', '[email protected]', 'janjan123')
user.is_staff = True
user.save()

Zmiana hasła:

from django.contrib.auth.models import User
user = User.objects.get(username__exact='jan')
user.set_password('nowehaslo123')
user.save()

Wylogowanie:

from django.contrib.auth import logout

def logout(request):
    logout(request)

Widok tylko dla zalogowanych – basic

def example_view(request):
    if not request.user.is_authenticated():
        # nie zalogowany? wypad

Widok tylko dla zalogowanych – dekorator

from django.contrib.auth.decorators import login_required

@login_required
def example_view(request):
    # działanie

Dekorator login_required służy do sprawdzenia czy użytkownik jest zalogowany. Jeśli tak, to nas wpuszcza i wykonuje się kod w widoku. Jeśli nie, to kod się nie wykonuje, a my zostajemy przekierowani pod LOGIN_URL (domyślnie accounts/login, zmieniamy w settings.py). Do URL dopisuje się parametr “next”, np. “accounts/login/?=next=user_profile/”

Logowanie użytkownika:

Do zalogowani się potrzeba nam dwóch rzeczy: funkcji authenticate() oraz login(). Pierwsza przyjmuje login i hasło oraz zwraca model User gdy True i None jeśli False. Funkcja login() zapisuje ID użytkownika w sesji.

from django.contrib.auth import authenticate, login

def example_view(request):
    login = request.POST.get('username', None)
    password = request.POST.get('password', None)
    auth = authenticate(username=login, password=password)
    if auth is not None:
        login(request, auth)
        # zalogowany
    else:
        # wypad stąd

Pełna dokumentacja na temat systemu użytkowników znajdziemy w oficjalnej dokumentacji tutaj.