Авторизация пользователя через Web-запрос #1

Jul 07, 2010 10:05

Источник: http://docs.djangoproject.com/en/dev/topics/auth/

Аутентификация через Web-запрос
С этого момента данный документ описывает порядок работы с низкоуровневым API по манипулированию с объектами аутентификации пользователей. На более высоком уровне Джанго позволяет использовать систему атуентификации с помощью объектов класса request.

Прежд всего, инсталлируйте в проекте промежуточное ПО SessionMiddleware и AuthenticationMiddleware добавив его в раздел MIDDLEWARE_CLASSES файла установок. Смотрите session documentation для более подробной информации.

После инсталляции этого ПО, вы получаете доступ к объектам request.user в файлах представления. Объект request.user возвращает объект User , представляющий текущего авторизированного пользователя.
Если пользователь не авторизирован, request.user вернет объект AnonymousUser (см. предыдущий раздел) Вы можете обработать эти объекты отдельно посредством атрибута is_authenticated(), например:

if request.user.is_authenticated():
    # Do something for authenticated users.
else:
    # Do something for anonymous users.



Как авторизировать пользователя
Джанго поддерживает две функции в пакете django.contrib.auth: authenticate() и login().

authenticate()¶

Чтобы обработать полученные логин и пароль, используйте функцию authenticate(). Она принимает два ключевых аргумента, username и password, и возвращает объект User, если пароль соответствует логину. Если не соответствует, то authenticate() возвращает объект None. Пример:

from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
    if user.is_active:
        print "You provided a correct username and password!"
    else:
        print "Your account has been disabled!"
else:
    print "Your username and password were incorrect."

login()¶

Чтобы авторизировать пользователя, используйте в представлении функцию login(). Они принимает в качестве аргументов объекты HttpRequest и User. login() сохраняет пользовательский ID в рамках сессии, используя для этого инфраструктуру Джанго по работе с сессиями, поэтому, как говорилось ранее, вам необходимо удостовериться в инсталляции соответствующего промежуточного ПО.

Этот пример показывает, как можно совместно использовать authenticate() и login():

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:
        if user.is_active:
            login(request, user)
            # Redirect to a success page.
        else:
            # Return a 'disabled account' error message
    else:
        # Return an 'invalid login' error message.

ВАЖНО! Сперва вызывается authenticate()

Когда вы вручную авторизируется пользователя, вы должны вызвать authenticate() прежде, чем login(). authenticate() определяет атрибут объекта User, который связывает этот объект с соответствующей учетной записью в соответствующей базе данных (см. backends documentation для получения дополнительной информации), и эти данные используются в дальнейшем в ходе авторизации.
Ручная проверка пароля пользователя

check_password()Если вы желаете вручную авторизировать пользователя путем сравнения пароля, введенного как простой текст, с хэшированным паролем в базе данных, используйте для этого удобную функцию django.contrib.auth.models.check_password(). Они принимает два аргумента: пароль как простой текст, который надо проверить, и полное значение поля, которое содержит проль пользователя, в базе данных, с которым производится сверка. Возвращает значение True в случае совпадения и False в противном случае.
Как деавторизировать пользователя
logout()

Для выхода пользователя из системы, который до того был авторизирован с помощью django.contrib.auth.login(), используйте django.contrib.auth.logout() внутри вашего представления. Функция принимает объект HttpRequest и не возвращает никакого значения. Пример:

from django.contrib.auth import logout

def logout_view(request):
    logout(request)
    # Redirect to a success page.

Обратите внимание, что logout() не генерирует никаких ошибок, если пользователь до того не был авторизован.

Изменения в Django 1.0: Вызов функции logout() теперь очищает данные пользовательской сессии.Когда вы вызываете logout(), данные сессии в ходе текущего запроса полностью очищаются. Все существующие данные уничтожаются. Это для того, чтобы предотвратить возможность авторизации другого лица, которое использует тот же браузер, и получение им доступа к всем данным предыдущей пользовательской сессии. Если вы хотите добавить что-то в сессию, которая вступает в силу после выхода пользователя, сделайте это после вызова django.contrib.auth.logout().

django, python, перевод

Previous post Next post
Up