System użytkowników i uprawnień
14 July 2008
Comments
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()
- 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
from django.contrib.auth import logout
def logout_view(request):
logout(request)
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):
# ...
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 = '/')
<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
Comment article