Paweł Kot

Python Django – system użytkowników i uprawnień

Django, najpopularniejszy i najbardziej kompleksowy framework do pisania stron i aplikacji webowych w języku python. Posiada on całą listę wbudowanych narzędzi jak ORM, system szablonów, routing, cache, system logowania i rejestracji, testowanie i system zarządzania użytkownikami i tym ostatnim się dziś zajmiemy.

System zarządzania użytkownikami znajduje się w pliku konfiguracyjnym settings.py w tablicy INSTALLED_APS: ‘django.contrib.auth’. Oczywiście jeśli nie chcesz z tego korzystać to usuwać linijkę i z bani.

Pola

Użytkownicy w Django to zwykły model znajdujący się w django/contrib/auth/models.py/User. Sam obiekt User ma następujące pola:

  • username – login użytkownika
  • first_name – pierwsze imię, pole opcjonalne
  • last_name – nazwisko, pole opcjonalne
  • email – email użytkownika, pole opcjonalne
  • password – hasło, pole wymagane, hasz i metadane hasła
  • is_staff – czy użytkownika ma dostęp do panelu admina, pole boolean: true, false
  • is_active – czy konto jest aktywne, czy możesz się zalogować do systemu, pole boolean: true, false
  • is_superuser – czy konto jest adminem, posiada wszystkie uprawnienia, pole boolean: true, false
  • last_login – pole daty, kiedy ostatnio byliśmy zalogowani
  • date_joined – data rejestracji w systemie

Metody

Obiekt User ma dwa pola many-to-may: groups oraz user_permissions (zarządzanie grupami oraz ograniczeniami dostępów). Dobijamy się do nich klasycznie przez menedżery: User.objects.permission.add(group, group, …). Obiekt User ma jeszcze kilka metod:

  • is_anonymous() – służy do rozróżnienia obiektów User i AnonymousUser. Raczej nie zaleca się stosowanie tego
  • is_authenticated() – zwraca True jeśli użytkownik jest zalogowany, False jak nie jest
  • get_full_name() – zwraca first_name i last_name w stylu “Jan Nowak”
  • set_password(haslo) – ustawia i haszuje hasło, lecz to jeszcze nie jest zapis do bazy danych
  • check_password(haslo) – zwraca true lub false jeśli dane hasło jest popranym 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 działa w bardzo prosty sposób: jeśli użytkownik jest zalogowany to nas wpuszcza i wykonujemy 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), z dopisaniem do URL parametru “next”, np. “accounts/login/?=next=user_profile/”

Logowanie użytkownika:

By zalogować użytkownika będziemy potrzebować dwóch rzeczy: funkcji authenticate() oraz login(). Pierwsza przyjmuje nasz login i hasło oraz zwraca model User jeśli 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

Wydaje mi się, że wypisałem tutaj takie najbardziej podstawowe i rzeczy związane z systemem użytkownika, z którymi zetknie się użytkownik. Pełna lista oczywiście w dokumentacji.