如何将API输入的密码与Django admin中存储的密码进行匹配?
问题核心原因
Django的用户密码在数据库中存储的是单向哈希后的结果,你直接把明文密码作为查询条件和库中哈希值做等值匹配,永远不可能得到正确结果,Django也不会在ORM查询时自动对password字段做加密转换。
解决方案
你不需要自己实现哈希加密逻辑,直接用Django原生提供的check_password方法完成明文密码和哈希值的校验即可,步骤如下:
- 仅通过邮箱查询到对应用户对象
- 调用用户对象的
check_password方法,传入明文密码完成校验
正确代码示例
from django.contrib.auth import get_user_model from django.core.exceptions import ObjectDoesNotExist User = get_user_model() try: email = self.serializer.validated_data['email'] input_password = request.data['password'] # 先仅通过邮箱查用户 user = User.objects.get(email=email) # 校验密码是否匹配 if not user.check_password(input_password): # 此处替换为你自己的密码错误处理逻辑 raise PermissionError("账号或密码错误") # 校验通过,可直接使用user对象发送OTP except ObjectDoesNotExist: # 此处替换为你自己的用户不存在处理逻辑 raise PermissionError("账号或密码错误")
补充说明
check_password是Django AbstractBaseUser类自带的内置方法,会自动读取你项目settings中配置的密码哈希算法,对输入的明文密码做加密后和库中存储的哈希值对比,只要你的用户模型是继承自Django官方的基础用户类,都可以直接使用,无需额外适配。
内容的提问来源于stack exchange,提问作者Proud
相关产品推荐
相关产品推荐

