首页 > 解决方案 > 即使数据库中的用户名和密码正确,身份验证也始终不返回 - DJANGO

问题描述

在此之前,我想说我已经看到了许多解决方案,但仍然无法正常工作,这就是我问这个问题的原因

所以我尝试制作一个登录表单和一个登录模块,当我正确插入用户名和密码时->我已经从数据库中复制了该值,因此它将相同 100% --->但身份验证始终不返回

我已经将值打印到 cmd 中,我输入的值与数据库中的值相同。

这是 login.html

<div id="login-page">
    <div class="container">
      <form class="form-login" method="post">
         {% csrf_token %}
        <h2 class="form-login-heading">sign in now</h2>
        <div class="login-wrap">
          <input type="text" name="username" class="form-control" placeholder="User ID">
          <br>
          <input type="password" name="password" class="form-control" placeholder="Password">
          <br>
           {% if messages %}
              <ul class="messages">
                {% for message in messages %}
                <font color="red"><li {% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li></font>
                {% endfor %}
              </ul>
            {% endif %}
         
              <button class="btn btn-theme btn-block" type="submit" href=""><i class="fa fa-lock"></i> SIGN IN</button>          
              
          <hr>
          
      </form>
    </div>
  </div>

这是登录的视图(我已经修改了登录)并注册

def login_view(request):
    if request.method == 'POST': 
        print("yes")        
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username)
        print(password)
        guest = User.objects.get(username=username)
        rolee= UserProfileInfo.objects.get(user_id = guest.id).role
        print(rolee)
        user = authenticate(username=username, password=password)  
        print(user)
        if user: 
            if rolee == 'Business Analyst':
                login(request, user)
                return redirect('/home/')
            elif rolee == 'Admin':
                login(request, user)
                return redirect('/manageuser/')
            elif rolee == 'Manager':
                login(request, user)
                return redirect('/approvallist/')
            elif rolee == 'Segment Manager':
                login(request, user)
                return redirect('/approvallist/')
        else:
            messages.error(request, "Invalid username or password!")
    form = AuthenticationForm()
    return render(request,"login.html",{"form":form})

def register(request):
    registered = False
    if request.method == 'POST':
        user_form = UserForm(data=request.POST)
        profile_form = UserProfileInfoForm(data=request.POST)
        if user_form.is_valid() and profile_form.is_valid():
            user = user_form.save(commit=False)   
            clearPassNoHash = user_form.cleaned_data['password']
            varhash = make_password(clearPassNoHash,None,'md5')
            user.set_password(varhash)  
            user.save()
            profile = profile_form.save(commit=False)
            profile.user = user            
            profile.save()
            registered = True
        else:
            print(user_form.errors,profile_form.errors)
    else:
        user_form = UserForm()
        profile_form = UserProfileInfoForm()
    return render(request,'register.html',
                          {'user_form':user_form,
                           'profile_form':profile_form,
                           'registered':registered})

模型.py

class UserProfileInfo(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    role = models.CharField(max_length=250, blank=True)
    description = models.TextField(max_length=250, blank=True)
    address = models.CharField(max_length=250, blank=True)
    phone = models.CharField(max_length=250, blank=True)
    cell = models.CharField(max_length=250, blank=True)
    def __str__(self):
      return self.user.username

最后一个是:forms.py


class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())
    class Meta():
        model = User
        fields = ('username','email','password')

class UserProfileInfoForm(forms.ModelForm):
     class Meta():
         model = UserProfileInfo
         fields = ('role','description','address','phone','cell')

在我修改之前登录

def login_view(request):
    if request.method == 'POST':         
        form = AuthenticationForm(data=request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            guest = User.objects.get(username=username)
            role = guest.role
            user = authenticate(username=username, password=password)  
            if user is not None: 
                if role == 'Business Analyst':
                    login(request, user)
                    return redirect('/home/')
                elif role == 'Admin':
                    login(request, user)
                    return redirect('/manageuser/')
                elif role == 'Manager':
                    login(request, user)
                    return redirect('/approvallist/')
                elif role == 'Segment Manager':
                    login(request, user)
                    return redirect('/approvallist/')
            else:
                messages.error(request, "Invalid username or password!")
        else:
            messages.error(request, "Invalid username or password!")
    form = AuthenticationForm()
    return render(request,"login.html",{"form":form})

笔记 :

  1. 首先我已经使用了 form.is_valid() -> 但它一直返回无效所以我删除了 form.is_valid() 所以我可以直接进行身份验证,但它总是说没有

  2. 在我散列密码之前,我的注册密码没有散列,并且我搜索身份验证需要散列密码,所以我尝试使用 django.contrib.auth.backend.md5hashers 或 settings.py 中的其他内容进行散列,并且已经散列,并且它仍然无法正常工作。

3.角色在不同的模型中

我希望有人可以修复它,已经尝试了很多方法并且无法完成..谢谢您的帮助<3

标签: django

解决方案


我发现了这个问题,在您的注册过程中,您正在使用:

user = user_form.save(commit=False)   
clearPassNoHash = user_form.cleaned_data['password']
varhash = make_password(clearPassNoHash,None,'md5')
user.set_password(varhash)  
user.save()

实际上,set_password将调用make_password自身,所以你应该这样做:

user = user_form.save(commit=False)   
clearPassNoHash = user_form.cleaned_data['password']
user.set_password(clearPassNoHash)  
user.save()

这是如何set_password定义的:

    def set_password(self, raw_password):
        self.password = make_password(raw_password)
        self._password = raw_password ```

推荐阅读