RkBlog

Hardware, programming and astronomy tutorials and reviews.

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:

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:

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

14 July 2008;

Comment article