用户登录,密码验证失败

来源:3-7 xadmin后台管理系统的配置

gcoupleJ

2017-09-02

我创建了一个超级用户admin,密码是admin123,无论xadmin登录,还是api 登录都失败。

都是 user.check_password(password) 的时候失败,我跟进了check_password函数

python36/lib/python3.6/site-packages/django/contrib/auth/hashers.py

http://szimg.mukewang.com/59aa3c0d000114ab16860292.jpg

http://szimg.mukewang.com/59aa3c0d0001f44814140732.jpg

http://szimg.mukewang.com/59aa3c0d0001a86723101354.jpg

encoded 和 我数据库实际存储的password hash后的值是一致的。

但hashers.py 中

is_correct = hasher.verify(password, encoded)
is_correct 返回 False

环境是python3.6.2,django 1.11.3 ,mysql 数据库校对集 utf8_general_ci


补充于 20170902 15:25

我发现问题了,创建用户的时候,make_password 会被调用两次,也就是sha256的结果又被算了一次。

验证的时候,只调用了一次,具体原因还在查。


补充于 20170902 16:19

我发现createsuperuser 以及其他创建用户的时候,会被调用到

apps/users/signals.py 中的 create_user

@receiver(post_save, sender=User)
def create_user(sender, instance=None, created=False, **kwargs):
   print('created:',created)
   if created:
        password = instance.password  # 这里的password是hash后的“pbkdf2_sha256$36000$wYmje2PDm17l$ogZ9HI1BiofA0ceWUi3r/rcKyoVFAYBmnV8OtBjrSHI=”
        instance.set_password(password)
        instance.save()
       






写回答

5回答

gcoupleJ

提问者

2017-09-02

为了不影响继续学习,我修改了 apps/users/signals.py 中的 create_user


# -*- coding: utf-8 -*-
__author__ = 'bobby'
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
from django.contrib.auth import get_user_model

User = get_user_model()

@receiver(post_save, sender=User)
def create_user(sender, instance=None, created=False, **kwargs):
   if created:
       password = instance.password
       if "pbkdf2_sha256$36000" in password:
           return
       instance.set_password(password)
       instance.save()

1
0

王英岚

2018-03-22

看到楼主的解决方案了,自己也试过了,可以解决登录时出现的问题。但是这样做会不会有别的问题,加密过的密码前面开头的字符串是固定的吗?

0
0

名字被用了

2018-01-30

怪不得总返回None,

0
0

慕运维7243590

2017-09-19

我也遇到同样问题,不知如何解决

0
0

gcoupleJ

提问者

2017-09-02

数据库校对集 utf8_general_ci

0
1
bobby
亲 我在课程中讲过在后台view的时候可以调用set_password设置密码, 在signal也可以调用这个 是否你在两个地方都调用了这个函数, 这里只能有一个地方调用这个
2017-09-04
共1条回复

Python前后端分离开发Vue+Django REST framework实战

Django REST framework课程视频,RESTFul API前后端分离开发

2906 学习 · 2491 问题

查看课程