Как вызвать метод authenticate () пользовательского письменного AuthenticationBackend django в views.py? - PullRequest
2 голосов
/ 08 февраля 2020

Я работаю над проектом Django, в котором я определил пользовательскую модель пользователя, для которой мне необходимо написать собственный метод аутентификации, следуя документации, которую я написал, как показано ниже. У меня проблема с вызовом это в views.py , пожалуйста, помогите мне, посмотрев следующий код
Я определил свой пользовательский бэкэнд следующим образом
Мой пользовательский бэкэнд аутентификации

from django.contrib.auth.backends import BaseBackend
from .models import User
from IntellerMatrix.CommonUtilities.constants import Constants


class AuthenticationBackend(BaseBackend):
    """
    Authentication Backend
    :To manage the authentication process of user
    """

    def authenticate(self, email=None, password=None):
        user = User.objects.get(email=email)
        if user is not None and user.check_password(password):
            if user.is_active == Constants.YES:
                return user
            else:
                return "User is not activated"
        else:
            return None

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

settings.py

AUTHENTICATION_BACKENDS = ['Modules.users.authentication.AuthenticationBackend',
                           'django.contrib.auth.backends.ModelBackend', ]

Views.py

def login(request):
    email = 'ialihaider75@gmail.com'
    password = 'ali'
    user = # how to call here that custom authentication backend's authenticate method

    if user is None:
        return HttpResponse("<p>Not Valid</p>")
    else:
        return HttpResponse(user)

Ответы [ 2 ]

2 голосов
/ 08 февраля 2020

Вы можете вызвать функцию authenticate(..) [Django -doc]

Используйте authenticate() для проверки набора учетных данных. Он принимает учетные данные в качестве аргументов ключевых слов, username и password для случая по умолчанию, проверяет их по каждому аутентификационному бэкэнду и возвращает объект User, если учетные данные действительны для бэкэнда. Итак:

from django.contrib.auth import authenticate

def login(request):
    email = 'ialihaider75@gmail.com'
    password = 'ali'
    user = <b>authenticate(request, email=email, password=password)</b>

    if user is None:
        return HttpResponse('<p>Not Valid</p>')
    else:
        return HttpResponse(user)

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

(…)

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

class AuthenticationBackend(BaseBackend):
    """
    Authentication Backend
    :To manage the authentication process of user
    """

    def authenticate(self, request, email=None, password=None):
        try:
            user = User.objects.get(email=email)
        except <b>User.DoesNotExist</b>:
            return None
        if user is not None and user.check_password(password):
            if user.is_active == Constants.YES:
                return user
        return <b>None</b>

Кроме того, не регистрирует в вашем использовании, это просто проверяет если учетные данные действительны. Поэтому вам все равно нужно вызвать функцию login(..) [Django -doc] , если вы хотите войти в систему пользователя.

2 голосов
/ 08 февраля 2020

Вместо непосредственного вызова authenticate() метода вашего класса Backend лучше использовать authenticate() функцию:

user = authenticate(email=email, password=password)

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

...