Аутентификация пользователя Django AbstractBaseUser-Вход в систему

#python #django #django-authentication

Вопрос:

это мое views.py файл

 def user_login(request):
if request.method == 'POST':    
    username = request.POST['username']
    password = request.POST['password']
    

    user = auth.authenticate(username=username, password=password)               

    if user is not None:
        auth.login(request, user)
        
        return redirect('user_home_url')

    else:
        messages.info(request, 'invalid username and password')
        return redirect('user_login_url')
 

models.py

 class User(AbstractBaseUser, PermissionsMixin):
"""Database Model for storing users profile"""
first_name = models.CharField(max_length = 15)
last_name = models.CharField(max_length = 15)
email = models.EmailField(max_length = 35, unique = True)
username = models.CharField(max_length = 35, unique = True)
is_active = models.BooleanField(default = False)
is_staff = models.BooleanField(default = False)
password = models.CharField(max_length = 25)
phone = models.CharField(max_length = 13, null = False, blank = False, unique = True)
phone_verified = models.BooleanField(default = False)
otp = models.IntegerField(null = True)

objects = UserProfileManager()

USERNAME_FIELD='username'
REQUIRED_FIELDS=['password','email','phone','first_name','last_name']


def get_full_name(self):
    """return full name of user"""
    return self.first_name   self.last_name

def __str__(self):
    """return string representation of user"""
    return self.email
 

settings.py

 AUTH_USER_MODEL = 'Users.User'
 

Пробовал разные методы, используя метод аутентификации, но всегда получал неверное имя пользователя и пароль

 def user_login(request):
if request.method == 'POST':    
    username = request.POST['username']
    password = request.POST['password']
    users = User.objects.all()
    
    for user in users:
        if user.email == email and user.password == password:
          return redirect('user_home_url')
 

когда я использую этот код в views.py вместо метода «аутентификация» он работает отлично, но проблема в том, что я не могу использовать @login_required

Извините, что задаю такие глупые вопросы, я новичок, и это мой первый вопрос

Ответ №1:

Это никогда не сработает, так как пароль НЕ сохраняется в базе данных в виде обычного текста, поэтому вы не можете сравнить полученный пароль с сохраненным

Самый простой способ-это

 from django.contrib.auth import authenticate
def user_login(request):
     if request.method == 'POST':    
        username = request.POST['username']
        password = request.POST['password']
        user = auth.authenticate(username = username, password=password)
        if user:     # as None means wrong username/password
           authenticate.login(request,user)
           return redirect('user_home_url')
        return HttpResponse("Wrong Username/Password")
 

Ответ №2:

Вы упомянули , что, когда вы сравниваете отправленный пароль с тем user.password , он «работает идеально». Это указывает на то, что вы сохранили пароли в базе данных в виде обычного текста.

Вам действительно нужно привыкнуть к хэшированию паролей. Джанго может позаботиться об этом за вас, так как AbstractBaseUser у set_password него есть метод:

 # Set a password manually
user.set_password('newpassword')
 

Как только вы соответствующим образом сохраните пароли, auth.authenticate метод должен делать то, что вы ожидаете.

Если вас интересует хэширование паролей, в документах Django есть отличная страница по управлению паролями.