Ищите исчерпывающее руководство по настройке пользовательских бэкэндов аутентификации в Django или указателей - PullRequest
3 голосов
/ 28 января 2010

Я пытаюсь настроить пользовательский бэкэнд, который запрашивает другую базу данных, для которой я создал модель в системе. Он использует свои собственные правила (электронная почта вместо имени пользователя и пароль с разными солями / хэшированными), поэтому я не могу использовать встроенную аутентификацию. Я настроил пользовательский сервер аутентификации следующим образом:

class BlahBlahBackend:

    def check_password():
        # check password code here
        return true

    def authenticate(self, email=None, password=None):
        import myapp.models.loginmodel
        try:
            person =  myapp.models.loginmodel.People.objects.get(email=email)
            if check_password(password, person.password):
                try:
                    user = User.objects.get(email=email)
                except User.DoesNotExist:
                    username=person.first_name + person.last_name
                    name_count = User.objects.filter(username__startswith = username).count()
                    if name_count:
                        username = '%s%s'%(username, name_count + 1)
                        user = User.objects.create_user(username,email)
                    else:
                        user = User.objects.create_user(username,email)
        except People.DoesNotExist:
            return None

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

Я добавил BlahBlahBackend в качестве бэкэнда аутентификации:

AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend', 'Socialauth.auth_backends.OpenIdBackend', 'Socialauth.auth_backends.TwitterBackend', 'Socialauth.auth_backends.FacebookBackend', 'Socialauth.auth_backends.BlahBlahBackend', )

Как вы видите, я также использую некоторые уже существующие аутентификационные бэкэнды, которые также есть в socialauth.

У меня есть форма представления, которая указывает на следующее представление:

def blahblah_login_complete(request):
    email = request.POST.get('email')
    password = request.POST.get('password')
    user = authenticate(email,password)
    # if user is authenticated then login user
    if user:
        login(request, user)
    else:
        return HttpResponseRedirect(reverse('socialauth_login_page'))

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

Я читал, что бэкэнды кэшируются и поэтому запускаются

Session.objects.all().delete()

для очистки кэша бэкэндов.

Мои основные вопросы:

  1. Порядок, в котором элементы перечислены в AUTHENTICATION_BACKENDS
  2. Как система решает / знает, какой бэкэнд использовать? Это никогда не было ясно из документации, и я нахожу это немного запутанным.
  3. Есть ли способ принудительного использования определенной авторизации на основании запроса. Другими словами, если кто-то отправляет форму, есть ли способ заставить его использовать аутентификацию на основе входа в систему, в отличие от входа через openid или Twitter?

Обновление:

Это работает! Это очень круто, спасибо. Я думаю, просто казалось, что django doc говорил: «Больше ничего не нужно делать, это просто работает, как по волшебству», и оказывается, что это абсолютно так. Пока есть серверная часть и правильно установлены учетные данные, аутентификация будет работать. Как оказалось, настоящей проблемой была неверная конфигурация в файле urls.py, который не отправлял сообщение из формы входа в правильный обработчик, поэтому он продолжал пытаться использовать другой метод аутентификации.

Ответы [ 3 ]

1 голос
/ 28 января 2010

Вы должны использовать ключевые аргументы для django.contrib.auth.authenticate () Имена должны совпадать с именами аргументов в методе аутентификации вашего бэкэнда. Бэкэнд по умолчанию обрабатывает имена «имя пользователя» и «пароль».

Ваш бэкэнд может использовать другое имя для аргументов ключевого слова, например: blahblah_email и blahblah_password, а затем вызвать аутентификацию (blahblah_email = ..., blahblah_password = ...).

1 голос
/ 28 января 2010

Полагаю, django-cas будет хорошим ориентиром для вас:)

И да, порядок AUTHENTICATION_BACKENDS имеет значение.

Django зацикливается на списке бэкэндов и останавливается на первом бэкэнде, в котором есть метод authenticate, принимающий параметры учетных данных, которые вы ему передали.

1 голос
/ 28 января 2010
  1. Это четко описано здесь - Джанго пробует каждый бэкэнд по порядку определяется, если сначала не удается аутентификация идет ко второму и т. д.

  2. Я полагаю, что вы можете загружать бэкэнд-класс динамически и аутентифицировать прямо через это. Посмотрите на источники функций django authenticate (), как это сделать.

...