【问题标题】:Django Python How to Compare Encrypt User's PasswordDjango Python如何比较加密用户的密码
【发布时间】:2018-04-03 04:45:07
【问题描述】:

我正在从事一个类似于网站的 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
  • @mohammedqudah 感谢您的评论,但我不想使用它。我只是想制作自己的模型。
  • 如果您为额外字段创建了自己的用户模型,请阅读这篇关于在 django 中扩展用户模型link
  • @bullception 请你也用模型更新你的代码
  • @ABDULNIYASPM 我做到了。 mohammedqudah 感谢您的文章。

标签: python django django-models password-encryption login-control


【解决方案1】:

我认为您应该尝试 django 身份验证功能。

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

【讨论】:

    【解决方案2】:

    你不应该比较密码:

    if myUsers.password == password ..:
    

    而是密码的哈希值:

    if myUsers.password == myPasswordHashFunction(password) ..:
    

    myPasswordHashFunction怎么写是你应该知道的细节,或者你最好使用django的authenticate函数。

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

    【讨论】:

      【解决方案3】:

      用户对象有一个名为check_password() 的方法,它可以根据存储在数据库中的散列密码对您的纯文本密码进行哈希处理并检查。

      https://docs.djangoproject.com/en/2.2/ref/contrib/auth/#django.contrib.auth.models.User.check_password

      示例用法:

      from account.models import myUsers
      
      password = request.POST.get('password')
      email = request.POST.get('email')
      
      user = myUsers.objects.get(email=email)
      
      if user.check_password(password):
          # Success Code
      else:
          # Error Code
      

      【讨论】:

        【解决方案4】:

        默认情况下,django.contrib.auth 中提供的 Django 身份验证系统要求最终用户使用用户名和密码进行身份验证。 如果您使用电子邮件和密码进行用户身份验证,则需要自定义身份验证后端。此链接将对您有所帮助。

        链接:https://stackoverflow.com/a/37332393/9563316

        如果您使用用户名和密码进行用户身份验证。你应该试试这样的。

        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/en/3.0/topics/auth/default/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-31
          • 1970-01-01
          • 1970-01-01
          • 2021-04-10
          • 2012-11-01
          • 2013-08-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多