Django - чтение текущего бэкэнд-класса аутентификации пользователя - PullRequest
4 голосов
/ 17 февраля 2011

Я использую пользовательский бэкэнд аутентификации с Django для автоматического создания и входа пользователей из устаревшей системы.Мой класс Backend такой:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
from sfi.models import Employee
import base64, hashlib

class SFIUserBackend(ModelBackend):
    def authenticate(self, username=None, password=None):
        if not username or not password:
            return

        digest = base64.standard_b64encode(hashlib.md5(password).digest())
        user = None
        try:
            employee = Employee.objects.get(login=username, passwd=digest)
            user, created = User.objects.get_or_create(username=username)
            if created:
                # setting attributes
                user.first_name = employee.names[:30]
                user.last_name = employee.surnames[:30]
                user.is_staff = True
                user.save()
        except Employee.DoesNotExist:
            pass

        return user

Пока все работает нормально.Тем не менее мне нужно прочитать внутренний класс текущего зарегистрированного пользователя в шаблоне.

Использование request.user.backend говорит о том, что user не имеет атрибута внутреннего интерфейса ... и я не могу прочитать его из сеанса(используя request.session._auth_user_backend), поскольку система шаблонов Django жалуется, что «Переменные и атрибуты могут не начинаться с подчеркивания».

Я использую django.contrib.auth.views.login, чтобы разрешить пользователям вход в систему.Что мне не хватает?

Ответы [ 3 ]

2 голосов
/ 04 мая 2011

Атрибут backend добавляется к объекту user, когда пользователь проходит аутентификацию с использованием функции django.contrib.auth.authenticate(username='foo',password='bar').

Эта функция, в свою очередь, вызывает все AUTHENTICATION_BACKENDS, которые вы указали в файле settings.py, до тех пор, пока она не сможет успешно пройти аутентификацию с использованием одного из них.

Если ваши пользователи "вошли в систему", но не имеют атрибута backend, это, вероятно, означает, что вы не выполняете их аутентификацию должным образом. Может быть, вы вызываете функцию SFIUserBackend.authenticate напрямую, когда вам следует вызывать функцию django.contrib.auth.authenticate?

Ознакомьтесь с этими документами по пользовательской аутентификации .

0 голосов
/ 09 мая 2018

Хотя authenticate() добавляет атрибут user.backend, а login() сохраняет его в сеансе, по какой-то причине get_user() не добавляет его обратно пользователю.Я представил патч .

Поэтому, чтобы получить к нему доступ в другом запросе, вам необходимо request.session[django.contrib.auth.BACKEND_SESSION_KEY].

. Вы также можете написать собственный тег или добавитьдля вашего контекста (под любым именем) для простоты использования.

0 голосов
/ 17 февраля 2011

Вы должны прочитать его в представлении и отправить соответствующую человеческую форму этого имени класса в качестве сообщения.

...