Бэкэнды авторизации Django + всегда возвращают «user.is_authenitcated» false - PullRequest
0 голосов
/ 24 августа 2018

Я использую авторизационные серверы для использования своей собственной базы данных с именем пользователя и паролем (наши собственные зашифрованные методы).

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

from django.contrib.auth.models import User
from workforce.models import GlobalUsers
from rest_framework.response import Response
from workforce.globalapiviews import hash_password

class EmailAuthBackend(object):

    def authenticate(self, request, username=None, password=None):
        try:
            hashedpassword = hash_password(password)
            user = GlobalUsers.objects.get(username=username, password=hashedpassword)
            print(hashedpassword)
            if user:
                return user
            else:
                return None
        except GlobalUsers.DoesNotExist:
            return Response(status=status.HTTP_204_NO_CONTENT)

    def get_user(self, wf_user_id):
        try:
            print(wf_user_id)
            return GlobalUsers.objects.get(pk=wf_user_id)
        except GlobalUsers.DoesNotExist:
            print(wf_user_id)
            return None

Когда дело доходит до HTML, всегда отображается кнопка «ВХОД» даже в случае успешного входа в систему.

Замечено, что user.is_authenticated всегда возвращаетсяfalse.

Может кто-нибудь подсказать, что я делаю не так.

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

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Если вам требуется заблокировать доступ к API-интерфейсу браузера без входа в систему, вам просто нужно добавить эту конфигурацию в файл settings.py

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
}

Затем, чтобы обеспечить простой способ входа в систему при использовании браузера, вы можете добавить следующее к тем же settings.py:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
}
0 голосов
/ 24 августа 2018

ваш код

    def authenticate(self, request, username=None, password=None):
        try:
            hashedpassword = hash_password(password)
            user = GlobalUsers.objects.get(username=username, password=hashedpassword)
            print(hashedpassword)
            if user:
                return user
            else:
                return None
        except GlobalUsers.DoesNotExist:
            return Response(status=status.HTTP_200_OK)

GlobalUsers.objects.get() вызывает исключение, когда пользователь не найден (он никогда не возвращает None).И в этом случае вы возвращаете Response (200_OK)

autenticate() должен вызвать исключение, если вы хотите, чтобы аутентификация не прошла, или вернуть None, если вы хотите перейти к следующему Backend

Здесь официальная документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...