Django AbstractBaseUser 身份验证-登录

时间:2021-06-13 04:13:50

标签: 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

<块引用>

抱歉问了这么愚蠢的问题,我是菜鸟,这是我的第一个问题

2 个答案:

答案 0 :(得分:0)

这将永远不会起作用,因为密码不会以纯文本形式保存在数据库中,因此您无法将收到的密码与保存的密码进行比较

最简单的方法是

git config credential.helper

答案 1 :(得分:0)

您提到当您将提交的密码与 user.password 进行比较时,它“完美运行”。这表明您已将密码以纯文本形式存储在数据库中。

您确实需要养成散列密码的习惯。 Django 可以为您处理这个问题,因为 AbstractBaseUser 有一个 set_password 方法:

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

一旦您正确保存了密码,auth.authenticate 方法应该可以满足您的预期。

如果您对密码散列感兴趣,Django 文档在 password management 上有一个很棒的页面。