关于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
相关产品推荐
相关产品推荐

