Главная | Архив новостей | Общение | Площадка | Примеры OpenID
Хостинг Django от «Джино»
Оглавление

Интеграция с системой аутентификации

Существует возможность интеграции Django с имеющейся системой аутентификации — с другим источником имён и паролей или методов аутентификации.

Например, ваша компания может уже использовать LDAP, в котором хранятся имена и пароли для каждого сотрудника. Администратору сети и пользователям быстро надоест использовать разные логины для работы с LDAP и Django приложениями.

Для решения этой задачи система аутентификации Django позволяет вам подключить внешние источники аутентификации. Вы можете переопределить схему аутентификации, изначально настроенную на использование базы данных, также вы можете использовать стандартную систему в тандеме с другими системами.

Описание источников аутентификации

С технической точки зрения, Django поддерживает список источников аутентификации. Когда кто-нибудь вызывает django.contrib.auth.authenticate() (описанный в главе «Сессии, пользователи и регистрация»), Django пытается проверить пользователя, используя все источники аутентификации. Django перебирает каждый источник, пока не найдёт совпавший.

Список источников аутентификации, предназначенных для использования, определён в параметре AUTHENTICATION_BACKENDS. Параметр должен хранить кортеж путей, которые указывают на классы, которые в свою очередь знают, как выполнять процедуру аутентификации. Эти классы могут быть где угодно, главное, чтобы их можно было найти через $PYTHONPATH.

По умолчанию, параметр AUTHENTICATION_BACKENDS содержит:

('django.contrib.auth.backends.ModelBackend',)

Это простая схема аутентификации, которая проверяет пользователя по базе данных.

Порядок определения источников в параметре AUTHENTICATION_BACKENDS имеет значение. Таким образом, если пользователь верно определён в нескольких источниках, Django остановит свой поиск при первом совпадении.

Реализация источников аутентификации

Источник аутентификации — это обычный класс, который имеет два метода: get_user(id) и authenticate(**credentials).

Метод get_user() принимает параметр id, который может быть именем пользователя, идентификатором в базе данных, да всем чем угодно, и возвращает объект User.

Метод authenticate() принимает удостоверение личности в виде именованных аргументов. Обычно это выглядит так:

class MyBackend(object):
    def authenticate(self, username=None, password=None):
        # Check the username/password and return a User.

Но также может принимать элемент FIXME???, например:

class MyBackend(object):
    def authenticate(self, token=None):
        # Check the token and return a User.

Другими словами, метод authenticate() должен проверять полученное удостоверение личности и должен возвращать объект User, который соответствует переданному удостоверению, если последнее является верным. В противном случае метод должен возвращать None.

Интерфейс администратора Django плотно объединён с собственным объектом User, описанным в главе «Сессии, пользователи и регистрация». Для взаимодействия с этой системой лучше всего создавать объект User для каждого пользователя, который существует в вашем источнике (т.е., для вашего LDAP, вашей внешней SQL базе данных и так далее.). Либо вы разработаете для этого скрипт, либо ваш метод authenticate() сделает это при первом входе пользователя в систему.

Ниже представлен пример источника, который аутентифицирует пользователей по переменным имени и пароля, определённым в файле конфигурации, и создаёт объект User при первой аутентификации пользователя:

from django.conf import settings
from django.contrib.auth.models import User, check_password

class SettingsBackend(object):
    """
    Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD.

    Use the login name, and a hash of the password. For example:

    ADMIN_LOGIN = 'admin'
    ADMIN_PASSWORD = 'sha1$4e987$afbcf42e21bd417fb71db8c66b321e9fc33051de'
    """
    def authenticate(self, username=None, password=None):
        login_valid = (settings.ADMIN_LOGIN == username)
        pwd_valid = check_password(password, settings.ADMIN_PASSWORD)
        if login_valid and pwd_valid:
            try:
                user = User.objects.get(username=username)
            except User.DoesNotExist:
                # Create a new user. Note that we can set password
                # to anything, because it won't be checked; the password
                # from settings.py will.
                user = User(username=username, password='get from settings.py')
                user.is_staff = True
                user.is_superuser = True
                user.save()
            return user
        return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None


Увидели ошибку?
Выделите её мышкой и нажмите
Ctrl-Enter
Обработано:
1049 49 130 71

Версия книги
1.0 2.0
Версия 2.0 в процессе перевода!

Мой луч
Многообразие света

Полезное
Актуальные вакансии, Python работа для python-разработчиков.


Скачать в формате
CHM от 2 сентября

Заказать PDF файл можно через почту, чат, джаббер. Всего 2WMZ. Содержимое точно соответствует содержимому сайта.
Чем чаще заказываете — тем больше перевожу.

Русская группа

на поддержку перевода
Яндекс Яндекс.Деньги Хочу такую же кнопку
Ускорить процесс перевода!
R130494980980
Z425285133788
E112528079659
U327380922061

Книга помогла реализовать:
Проект «Мой луч»
АРМ УФМС.


Мой вебсайт стоит666 337,31 руб

© 2008-2009 Ruslan Popov @ gmail.com Powered by Django 1.1 beta 1 SVN-11114
Главная | Архив новостей | Общение | Площадка | Примеры OpenID