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

关于Django登录页实现用户名严格大小写匹配校验的技术咨询

Django实现用户名大小写敏感登录

默认情况下Django的用户认证对用户名是大小写不敏感的,要实现精确匹配的话,按以下步骤操作:

1. 自定义认证后端

在你的应用目录下新建backends.py文件,编写自定义的认证后端类,替换默认的不区分大小写查询逻辑:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model

UserModel = get_user_model()

class CaseSensitiveModelBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            # 精确匹配用户名,区分大小写
            user = UserModel.objects.get(username=username)
        except UserModel.DoesNotExist:
            # 执行假的密码哈希操作,避免时序攻击泄露用户名存在性
            UserModel().set_password(password)
            return None
        
        # 验证密码并检查用户是否可认证
        if user.check_password(password) and self.user_can_authenticate(user):
            return user

2. 配置使用自定义后端

在项目的settings.py中修改AUTHENTICATION_BACKENDS,指定我们刚写的后端:

AUTHENTICATION_BACKENDS = [
    'your_app_name.backends.CaseSensitiveModelBackend',
    # 若有其他认证需求,可保留原有后端,但自定义后端需放在首位
]

3. 数据库层面的补充(针对MySQL)

如果你的数据库是MySQL,默认的字符排序规则(如utf8mb4_general_ci)是不区分大小写的,即使后端用了精确匹配,数据库仍会返回匹配结果。这时需要修改用户名字段的排序规则:

如果用的是自定义User模型,修改username字段的定义:

from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    username = models.CharField(
        max_length=150,
        unique=True,
        db_collation='utf8mb4_bin',  # 启用大小写敏感的排序规则
    )

修改后需要执行数据库迁移:

python manage.py makemigrations
python manage.py migrate

完成以上配置后,只有输入与数据库中完全一致(包括大小写)的用户名才能成功登录,比如数据库存储的是master,输入MASTER或大小写混合的变体都会认证失败。

内容的提问来源于stack exchange,提问作者dineshraj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 21:26:05