System użytkowników i uprawnień

Jak działa i jak korzystać z systemu użytkowników/uprawnień

Sprawdź czy w settings.py w INSTALLED_APPS masz django.contrib.auth (powinien być), jeżeli nie dodaj i wykonaj polecenie python manage.py syncdb
Użytkownicy reprezentowani są przez zwykły model Django znajdujący się w django/contrib/auth/models.py. Obiekt User ma następujące pola:
  • username - 30 znaków lub mniej (litery, cyfry, podkreślenia)
  • first_name - Opcjonalne, 30 znaków lub mniej.
  • last_name - Opcjonalne, 30 znaków lub mniej.
  • email - Opcjonalne, adres email
  • password - Wymagane, hasz i metadane hasła. Szczegóły dalej.
  • is_staff - Boolean. Czy użytkownik ma dostęp do panelu admina
  • is_active - Boolean. Czy użytkownik może się zalogować, czy konto jest aktywne.
  • is_superuser - Boolean. Określa czy użytkownik jest adminem. Admin ma wszystkie uprawnienia bez ich jawnego przypisania.
  • last_login - datetime, przechowuje datę ostatniego logowania
  • date_joined -- przechowuje datę rejestracji

Metody

Obiekty User mają dwa pola many-to-many: groups i user_permissions. Obiekty User mogą uzyskać dostęp do zależnych obiektów w taki sam sposób jak inne modele django:
myuser.objects.groups = [group_list]
myuser.objects.groups.add(group, group,...)
myuser.objects.groups.remove(group, group,...)
myuser.objects.groups.clear()
myuser.objects.permissions = [permission_list]
myuser.objects.permissions.add(permission, permission, ...)
myuser.objects.permissions.remove(permission, permission, ...]
myuser.objects.permissions.clear()
Oprócz tego obiekty User posiadają następujące metody:
  • is_anonymous() - Zwraca False dla obiektu User, True dla AnonymousUser. Służy do rozróżniania obiektów User i AnonymousUser. Zaleca się stosowanie is_authenticated()
  • is_authenticated() - Zwraca True dla User, False dla AnonymousUser. Określa czy użytkownik jest zalogowany (uwierzytelniony)
  • get_full_name() - Zwraca wartości first_name i last_name oddzielone spacją (imie i nazwisko)
  • set_password(hasło) - Ustawia nowe hasło (haszuje). Nie zapisuje obiektu User.
  • check_password(hasło) - Zwraca True jeżeli podane hasło jest poprawnym hasłem użytkownika.
  • get_group_permissions() - Zwraca listę uprawnień (łańcuchów) jaką użytkownik posiada będąc w określonych grupach
  • get_all_permissions() - Jak powyżej z tym że dodaje również bezpośrednie uprawnienia użytkownika nie wynikające z bycia w określonych grupach
  • has_perm(perm) -- Zwraca True jeżeli użytkownik ma określone uprawnienie, gdzie "perm" (updawnienie) jest w formacie "package.codename".
  • has_perms(perm_list) -- Zwraca True jeżeli użytkownik ma wszystkie podane w liście uprawnienia
  • has_module_perms(package_name) -- Zwraca True jeżeli użytkownik ma jakieś uprawnienia dla danego modułu (etykieta aplikacji).
  • get_and_delete_messages() - Pobiera listę obiektów Message czekających na użytkownika i kasuje je z kolejki.
  • email_user(temat, treść, from_email=None) -- Wysyła email użytkownikowi
  • get_profile() - Zwraca profil użytkownika jeżeli strona na to zezwala.

Funkcje Menedżera

create_user(username, email, password)
Tworzy/Zapisuje nowego użytkownika i zwraca obiekt User.
make_random_password(length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789')
Zwraca losowe hasło o podanej długości zawierające znaki spośród "allowed_chars".

Proste zastosowania

Tworzenie użytkownika

>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
>>> user.is_staff = True
>>> user.save()

Zmiana Hasła

>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username__exact='john')
>>> u.set_password('new password')
>>> u.save()

Logowanie i wylogowanie użytkownika

By zalogować użytkownika mamy dwie funkcje - authenticate() i login(). Pierwsza pobiera jako argumenty login i hasło. Zwróci obiekt User jeżeli dane były poprawne lub None jeżeli nie. login() zapisuje ID użytkownika w sesji (które muszą działa - SessionMiddleware). Oto przykład:
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)
        # zalogowany
    else:
        # błąd
Wylogowanie:
from django.contrib.auth import logout

def logout_view(request):
    logout(request)
Widok tylko dla zalogowanych, wersja podstawowa:
from django.http import HttpResponseRedirect

def my_view(request):
    if not request.user.is_authenticated():
    	#niezalogowany, zrób coś...

Z wykorzystaniem dekoratora login_required:
from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    # ...
login_required działa tak: jeżeli użytkownik jest zalogowany to widok wykonuje się normalnie. jeżeli nie następuje przekierowanie na LOGIN_URL (domyślnie accounts/login) z przesłaniem bieżącej ścieżki z URLa pod zmienną "next", np. jeżeli przekierowanie następuje z "/polls/3/" to wynikowy URL przekierowania będzie miał postać "/accounts/login/?next=/polls/3/".

Wbudowane widoki do obsługi użytkowników

Django posiada szereg gotowych widoków do rejestracji, logowania, wylogowania użytkowników, a także do zmiany hasła. Widoki te dostępne są w django.contrib.auth.views i wystarczy dostarczyć własny szablon żeby uzyskać w pełni funkcjonalny widok. Pełna lista widoków dostępna jest w dokumentacji Django. Oto przykład:
def login_user(request):
	"""
	django.contrib.auth.views.login login view
	"""
	if not request.user.is_authenticated():
		return django.contrib.auth.views.login(request, template_name='userpanel/login.html')
	else:
		return HttpResponseRedirect("/user/")

def logout_then_login(request):
	"""
	django.contrib.auth.views.logout_then_login logout view
	"""
	return django.contrib.auth.views.logout_then_login(request, login_url = '/')
I szblon login.html:
<form method="post" action="/user/login/">
<div class="content">
<table>
<tr><th colspan="2" class="first"><strong>{% trans "Standard login" %}</strong></th></tr>
<tr class="rowA small"><td class="first" style="width:30%;"><label for="id_username">{% trans "Username" %}:</label></td><td>{{ form.username }}</td></tr>
<tr class="rowB small"><td class="first"><label for="id_password">{% trans "Password" %}:</label></td><td>{{ form.password }}</td></tr>
<tr class="rowA small"><td class="first" colspan="2"><input type="submit" value="{% trans "Login" %}"></td></tr>
</table>
<input type="hidden" name="next" value="{{ next }}" />
</div>
</form>
blog comments powered by Disqus

Kategorie

Strony