Django 2.0如何添加自定义密码验证器(含大小写/符号/数字要求)
自定义Django密码验证器:添加大写字母、符号、数字要求
当然有简便的方法来扩展Django的密码验证规则啦!Django的AUTH_PASSWORD_VALIDATORS系统本身就支持自定义验证器,完全可以满足你要求密码包含大写字母、数字和特殊符号的需求,而且做法规范,符合框架设计逻辑。
步骤1:创建自定义密码验证器类
首先,在你的Django项目里选一个合适的app(比如专门处理用户逻辑的accounts app),创建一个validators.py文件,编写继承自BasePasswordValidator的自定义验证器:
from django.contrib.auth.password_validation import BasePasswordValidator from django.core.exceptions import ValidationError import re class ComplexPasswordValidator(BasePasswordValidator): def validate(self, password, user=None): # 逐一检查密码复杂度要求 if not re.search(r'[A-Z]', password): raise ValidationError("密码必须包含至少一个大写字母。") if not re.search(r'[0-9]', password): raise ValidationError("密码必须包含至少一个数字。") if not re.search(r'[^A-Za-z0-9]', password): raise ValidationError("密码必须包含至少一个特殊符号(如!@#$%^&*等)。") def get_help_text(self): # 该方法返回的文本会自动显示在密码输入框下方,提示用户规则 return "密码必须包含至少一个大写字母、一个数字和一个特殊符号(非字母数字)。"
步骤2:在settings.py中注册自定义验证器
打开项目根目录的settings.py,找到AUTH_PASSWORD_VALIDATORS配置项,把你刚写的自定义验证器添加到列表末尾(保留默认的四个验证器,这样既有基础规则又能叠加自定义规则):
AUTH_PASSWORD_VALIDATORS = [ # 默认的四个验证器 { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, # 添加自定义验证器,注意路径要对应你的app和文件 { 'NAME': 'accounts.validators.ComplexPasswordValidator', }, ]
为什么推荐这种方式?
- 完全契合Django的扩展机制,和系统自带验证器逻辑统一,后期维护更省心;
- 自定义的
get_help_text方法能自动在用户注册、修改密码的表单中显示提示信息,不用额外处理前端文本; - 验证逻辑集中在一个类里,后续要调整规则(比如修改特殊符号的范围),只需要修改这个类即可,不用到处找零散的正则代码。
如果你只是临时测试或者快速实现,也可以直接在表单的clean_password方法里写正则检查,但用自定义验证器类是更专业、可复用的做法哦。
内容的提问来源于stack exchange,提问作者Ruchit
相关产品推荐
相关产品推荐

