验证函数不返回任何值,因此用户无法登录

时间:2019-06-27 09:17:18

标签: django

from django.shortcuts import render, redirect, reverse
from reg.models import Reg_page
from django.contrib.auth.models import User,auth
from django.contrib import messages
from django.contrib import auth
from django.contrib.auth import authenticate,login
from django.http import HttpResponseRedirect
from django.db.models import Q
from django.core.exceptions import ObjectDoesNotExist
from django.template import RequestContext
def user_login(request):
 if request.method == 'POST':
    username = request.POST['username']
    password = request.POST['password']
    print("username", username)
    print("password", password)
    user=auth.authenticate(username=username, password=password)
    #user=User.objects.filter(username=username, password=password).exists()
    print("value",user)
    if user:
        auth.login(request, user)
        return redirect("/welcome")
    else:
        return render(request, "login.html", {'error': 'username and password incorrect'})
else:
    return render(request, "login.html")

用户无法登录,因为认证函数不返回任何值,它不给出任何错误 所以让我知道我该怎么做?

1 个答案:

答案 0 :(得分:0)

不是将密码作为原始文本存储在数据库中,这是非常不安全的。例如,如果您的数据库遭到了某种方式的黑客入侵,则黑客可以访问所有密码。

常见的保护机制是hashing [wiki],其中使用单向哈希函数创建“摘要”并将其存储在数据库中。进行身份验证以对密码运行相同的哈希,然后查看摘要是否相同。结果,在不知道密码的情况下,服务器可以知道两个密码是否相等(或者很可能相等)。

如果创建原始User对象,则不会通过哈希函数传递密码。使用数据库中的摘要进行身份验证与使用原始密码进行身份验证不同,因此确实会失败。一个User对象存在该特定的原始摘要这一事实,并不意味着它是密码,因此,您不能指望因为.exists()成功了,所以身份验证也成功了。 / p>

要设置密码,您应该使用set_password [Django-doc],或使用changepassword command [Django-doc]更改密码。如果您创建用户,则应使用create_user [Django-doc]对输入的密码进行相应的哈希处理。