#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 есть отличная страница по управлению паролями.