You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

额外优化建议

  1. 避免全表遍历:随着用户量增长,遍历所有用户会导致性能急剧下降。由于Django密码哈希是加盐存储(每个用户盐值不同),无法直接通过数据库查询匹配,但可通过过滤活跃用户、添加索引等方式优化遍历效率。
  2. 用户创建校验:确保创建用户时,将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:22:53