Django Python如何比较加密后的用户密码

6

我正在开发一个类似于网站内容管理系统(CMS)的项目。我使用django python开发这个系统,但我对django python不太熟悉。

我有自己的用户模型(不是django用户模型),其中包含一些字段,如用户名、电子邮件、密码等,并且我从自己的管理面板中创建新用户。

如何比较加密后的密码与用户在登录页面上提交的密码。

例如,第一次创建用户时,密码为123,在数据库中保存为pbkdf2_sha24123$000asd$...。之后,我尝试使用密码123登录,但是我收到错误消息,提示密码不相等。

from django.contrib.auth.hashers import make_password
from account.models import myUsers

password = make_password(request.POST.get('password'))
email = request.POST.get('email')

if myUsers.password == password and myUsers.email == email:
     #make login and redirect to panel
else:
     #show error message

我自己的模型就像;

class myUsers(models.Model):
    username = models.CharField(max_length=25, verbose_name='username', unique=True)
    email = models.CharField(max_length=225, verbose_name='email', unique=True)
    password = models.CharField(max_length=225, verbose_name='password')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='created date')
    secret_question = models.CharField(max_length=225, verbose_name='secret question')
    secret_answer = models.CharField(max_length=225, verbose_name='secret answer')
    last_login = models.DateTimeField(verbose_name='last login')
    secret_guid_key = models.CharField(max_length=15, verbose_name='recover key', unique=True, editable=False, default=uuid.uuid4().hex[:15])
    user_role = models.CharField(max_length=6, verbose_name='member role')

Django本身带有登录/注册系统,非常容易上手。请查看此链接:link - mohammedgqudah
@mohammedqudah 谢谢您的评论,但我不想使用那个。我只是想制作自己的模型。 - user518851726681
如果您为了额外的字段创建了自己的用户模型,请阅读有关在Django中扩展用户模型的内容[链接](https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html)。 - mohammedgqudah
@bullception,请问您能否更新您的代码,加入模型部分? - Abdul Niyas P M
@ABDULNIYASPM 我已经看过了。mohammedqudah,感谢您的文章。 - user518851726681
5个回答

21

1
我认为你应该尝试使用Django的身份验证功能。
user = authenticate(username=username, password=password)

1

您不应该比较密码:

if myUsers.password == password ..:

但是实际上存储的是密码的哈希值:
if myUsers.password == myPasswordHashFunction(password) ..:

如何编写myPasswordHashFunction是你应该详细了解的内容,否则最好使用Django的authenticate函数。

如果你不是安全专家,请(请!)不要发明自己的用户认证和授权方式。


0

尝试这段代码:

from django.contrib.auth.models import auth

from django.contrib import messages


def signin(request):

    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = auth.authenticate(username=username, password=password)
        if user:
            auth.login(request, user)
            return redirect('/')
        else:
            messages.info(request, 'Invalid credentials!!')
            return redirect('signin')
    else:
        return render(request, 'signin.html')

-1
默认情况下,Django身份验证系统提供了django.contrib.auth,要求最终用户使用用户名和密码进行身份验证。如果您使用电子邮件和密码进行用户身份验证,则需要自定义身份验证后端。此链接将帮助您。
链接:https://dev59.com/RFoU5IYBdhLWcg3wjHhL#37332393 如果您使用用户名和密码进行用户身份验证,则应尝试类似以下内容的操作。
from django.contrib.auth import authenticate, login
from django.contrib import messages

def userLogin(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        user = authenticate(request, username=username, password=password)

        if user is not None:
            login(request, user)
            return redirect('somewhere-you-want')          
        else:
            messages.error(request, 'Invalid user login credentials!')
            return redirect('userLogin')
    else:
        return render(request, 'login.html')

请看这里的文档:https://docs.djangoproject.com/zh-hans/3.0/topics/auth/default/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接