Django仅通过密码(RFID码)实现认证失败,求排查原因
Django仅密码认证失败原因及修复方案
核心问题:认证后端的循环逻辑错误
你的CustomAuthenticationBackend.authenticate方法存在致命逻辑缺陷:
- 遍历用户时,只要第一个用户的密码不匹配,就直接抛出
User.DoesNotExist异常,触发外层except分支返回None,完全跳过后续所有用户的验证。 - 只有当系统中第一个用户的密码恰好匹配时才会返回该用户,其他合法用户永远无法通过认证。
修复后的认证后端代码
修改backend.py的authenticate方法,移除循环内的异常抛出,遍历所有用户直到找到匹配项:
class CustomAuthenticationBackend(BaseBackend): def authenticate(self, request, password=None): if not password: return None User = get_user_model() # 仅遍历活跃用户,减少无效检查 for user in User.objects.filter(is_active=True): if user.check_password(password): return user # 所有用户均不匹配时返回None return None def get_user(self, user_id): try: return get_user_model().objects.get(pk=user_id) except get_user_model().DoesNotExist: return None
额外优化建议
- 避免全表遍历:随着用户量增长,遍历所有用户会导致性能急剧下降。由于Django密码哈希是加盐存储(每个用户盐值不同),无法直接通过数据库查询匹配,但可通过过滤活跃用户、添加索引等方式优化遍历效率。
- 用户创建校验:确保创建用户时,将RFID码作为
password参数传入create_user方法,这样set_password才能正确完成哈希存储:# 示例:用RFID码创建用户 user = CustomUser.objects.create_user( password="你的RFID码", username="test_user", first_name="Test", last_name="User" )
内容的提问来源于stack exchange,提问作者zymod
相关产品推荐
相关产品推荐

