Django: пользовательская аутентификация заголовка http - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу создать аутентификацию для моего проекта Django 1.11. Пользователь будет аутентифицирован, если запрос содержит заголовок: X_USERNAME. Я работаю с общими представлениями, поэтому я использую LoginRequiredMixin для контроля доступа.

Я сделал этот класс пользовательской аутентификации:

class CustomAuthentication:
    def authenticate(self, request):
        username = request.META.get('X_USERNAME')
        logging.warning(username)
        if not username:
            return None
        try:
            user = User.objects.get(username=username)
        except User.DoesNotExist:
            user = User(username=username)
            user.is_staff = False
            user.is_superuser = False
            if request.META.get('X_GROUPNAME') == 'administrator':
                user.is_staff = True
                user.is_superuser = True
            user.save()
        return user, None

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

Я добавил это в своих настройках:

AUTHENTICATION_BACKENDS = ['path.to.file.CustomAuthentication']

Но я не могу заставить это работать. Я перенаправлен на /accounts/login/?next=, который не существует.

Заранее спасибо!

EDIT:

Я также попытался создать подкласс, как описано здесь: Документация Django RemoteUser , так как это похоже на то, чего я хочу достичь:

class CustomAuthentication(RemoteUserMiddleware):
    header = 'HTTP_X_USERNAME'

Это дало мне тот же результат.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Мне наконец-то удалось найти решение:

In authentication.py:

from django.contrib.auth.middleware import RemoteUserMiddleware
from django.contrib.auth.middleware import RemoteUserBackend

class CustomMiddleware(RemoteUserMiddleware):
    header = 'HTTP_X_USERNAME'

Второй импорт является обязательным, я не знаю, почему.

В settings.py:

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'app.authentication.CustomMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

AUTHENTICATION_BACKENDS = ['app.authentication.RemoteUserBackend']

И, наконец, в представлениях на основе классов я использую LoginRequiredMixin

0 голосов
/ 06 ноября 2018

Кажется, что метод authenticate() должен указывать аргументы username и password в дополнение к аргументу request. Без них Django игнорирует бэкэнд (см. django.contrib.auth.__init__._authenticate_with_backend в Django 2.0).

В вашем случае вы сможете установить по умолчанию эти аргументы на None, поскольку вы предоставляете имя пользователя через заголовок.

class CustomAuthentication:
    def authenticate(self, request, username=None, password=None):
        username = request.META.get('X_USERNAME')
        ...

В качестве альтернативы используйте **credentials:

def authenticate(self, request, **credentials):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...