authenticate (request, username = username, password = pswd) возвращает None для пользовательской модели пользователя - PullRequest
1 голос
/ 09 февраля 2020

Функция authenticate () не возвращает ничего для зарегистрированных пользователей в mySQL db. Я использую пользовательскую проверку, в которой процесс регистрации работает отлично. Я использую Django 3.0. Значение Account.objects.get(username = "uname").password == request.POST['password'] равно True

, вот мои модели.py

class AccountManager(BaseUserManager):
    #pass USERNAME_FIELD, REQUIRED_FIELDS 
    def create_user(self, email, username, password=None):
        if not email:
            raise ValueError( "Email Id not entered")

        if not username: 
            raise ValueError("User Name not entered")

        user = self.create_user(
            email = self.normalize_email(email),
            username = username,
        )

        user.set_password(password)    
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, password):
        user = self.create_user(
            email = self.normalize_email(email),
            password = password,
            username = username,
        )

        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True
        user.save(using = self._db)
        return user


# Create your models here.
class Account(AbstractBaseUser):
    username     = models.CharField(max_length = 50, unique= True)
    email        = models.EmailField(verbose_name = "email", max_length = 50, unique=True)
    #few other fields...

    USERNAME_FIELD = "username"
    REQUIRED_FIELDS = ['email']

    objects = AccountManager()
    # any object from Account.object will return __str__ 
    def __str__(self):
        return self.username

    #give permitions to custom user object
    def has_perm(self, perm, obj=None):    
        return self.is_admin

    def has_module_perms(self, app_label):
        return True

views.py


def register(request):
    context = {}
    if request.POST:
        form = RegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            name = form.cleaned_data.get("username")
            raw_password= form.cleaned_data.get('password1')

            account = authenticate(username = name, password = raw_password)
            login(request, account)
            print(str(account))
            return redirect('../dashboard/')
        else: 
            context['registration_form'] = form
    else:
        form = RegistrationForm()
        context['registration_form'] = form
    return render(request, 'register.html')

def login(request):
        context = {}
        if request.method == "POST":
            form = AuthenticationForm(request.POST)

            if form.is_valid:#returns True
                name = request.POST["username"]
                pswd = request.POST["password"]
                user = authenticate(request, username = name, password = pswd)
                print("user = " + str(user)) #always returns None

                if user:
                    print("valid user " + str(user))
                    login(request, user)
                    print("user is " + str(request.user.is_authenticated))
                    return  redirect("../dashboard/") 
        form = AuthenticationForm()
        context['login_form'] = form
        return render(request, 'login.html', context)

settings.py

AUTH_USER_MODEL = "authenticate.Account"
AUTHENTICATION_BACKENDS = (
    #'authenticate.Accounts.'
    'django.contrib.auth.backends.ModelBackend',
)

не могли бы вы увидеть, в чем ошибка?

извините, пожалуйста, мои этикеты, так как это мой первый вопрос в stackoverflow, и, пожалуйста, учтите, что я только начал работать над django несколько недель go

1 Ответ

0 голосов
/ 09 февраля 2020

Значение Account.objects.get(username='uname').password == request.POST['password'] равно True.

Это не очень хорошая идея. Обычно пароли хэшируются . Именно поэтому базовый класс AbstractBaseUser реализует метод set_password(..) [Django -doc] . Это будет иметь sh пароль и сохранит хешированный пароль в базе данных.

Метод authenticate(..) сначала также будет иметь sh данный пароль, а затем проверит, соответствует ли этот хешированный пароль тот, который хранится в базе данных.

См. Управление паролями в Django разделе для получения дополнительной информации.

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