如何在Django的authenticate函数中校验用户名、密码及is_live字段?
解决Django登录时校验自定义is_live字段的问题
要让authenticate函数同时校验用户名、密码和is_live字段,你需要自定义认证后端——因为默认的ModelBackend只会校验用户名和密码。具体步骤如下:
1. 自定义认证后端
在你的app目录下新建backends.py文件,写入以下代码:
from django.contrib.auth.backends import ModelBackend from django.contrib.auth import get_user_model User = get_user_model() class CustomAuthBackend(ModelBackend): def authenticate(self, request, username=None, password=None, **kwargs): try: # 根据用户名匹配用户 user = User.objects.get(username=username) # 同时校验密码正确性和is_live状态 if user.check_password(password) and user.is_live: return user return None except User.DoesNotExist: return None
这里的逻辑是:先找到对应用户,只有当密码正确且is_live为True时,才返回用户对象,否则返回None。
如果需要动态指定is_live的校验值(比如某些场景需要校验is_live=0),可以修改后端方法,接收传入的参数:
def authenticate(self, request, username=None, password=None, **kwargs): try: user = User.objects.get(username=username) # 获取传入的is_live要求,默认校验True required_status = kwargs.get('is_live', True) if user.check_password(password) and user.is_live == required_status: return user return None except User.DoesNotExist: return None
2. 配置认证后端
在项目的settings.py中修改AUTHENTICATION_BACKENDS,替换为你自定义的后端:
AUTHENTICATION_BACKENDS = [ '你的app名称.backends.CustomAuthBackend', # 替换为实际的app路径 # 若需保留其他认证方式,可继续添加 ]
3. 修改登录视图
现在authenticate会自动处理is_live的校验,调整视图代码如下:
def login_user(request): if request.method == "POST": username = request.POST.get('phone') password = request.POST.get('psw') if not User.objects.filter(username=username).exists(): messages.error(request, '无效的用户名') return redirect('/login_form/') # 调用authenticate,后端自动完成三个字段校验 user = authenticate(username=username, password=password) # 如果是动态校验场景,可传参数:authenticate(username=username, password=password, is_live=True) if user is None: messages.error(request, "密码错误或账号未激活") return redirect('/login_form/') else: login(request, user) return redirect('/index') return HttpResponse("error")
为什么之前的方法无效?
Django的authenticate函数本身只是调用配置的认证后端处理逻辑,默认的ModelBackend仅处理username和password参数,其他参数会被直接忽略;而staff_member_required装饰器是专门校验用户是否为staff身份的,和自定义的is_live字段无关,所以复用它无法解决问题。
内容的提问来源于stack exchange,提问作者AMAN CHAVAN
相关产品推荐
相关产品推荐

