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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:17:13