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

使用Django创建含username和code的自定义用户模型并实现创建时认证

Django 自定义仅含 username 和 code 的用户模型并自动认证

1. 定义自定义用户模型及管理器

Django 要求自定义用户模型继承 AbstractBaseUser 以保留认证核心能力,我们可以仅保留 username 和 code 字段,同时通过管理器实现创建时的认证逻辑绑定:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin

class CustomUserManager(BaseUserManager):
    def create_user(self, username, code, **extra_fields):
        # 校验必填字段
        if not username:
            raise ValueError("必须提供 username")
        if not code:
            raise ValueError("必须提供 code")
        
        user = self.model(username=username, code=code, **extra_fields)
        # 将 code 作为认证密码存入(Django 会自动加密)
        user.set_password(code)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, code, **extra_fields):
        # 超级用户必须开启 staff 和 superuser 权限
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)

        if extra_fields.get("is_staff") is not True:
            raise ValueError("超级用户必须设置 is_staff=True")
        if extra_fields.get("is_superuser") is not True:
            raise ValueError("超级用户必须设置 is_superuser=True")

        return self.create_user(username, code, **extra_fields)

class CustomUser(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(max_length=150, unique=True)
    code = models.CharField(max_length=100)  # 根据需求调整长度
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = CustomUserManager()

    # 指定 username 作为登录认证的唯一标识
    USERNAME_FIELD = "username"
    # 创建用户时必须提供的字段
    REQUIRED_FIELDS = ["code"]

    def __str__(self):
        return self.username

2. 配置项目使用自定义用户模型

在项目的 settings.py 中添加如下配置,指定自定义用户模型:

AUTH_USER_MODEL = "你的应用名.CustomUser"

3. 自定义认证后端(可选)

如果需要严格校验 code 与认证密码完全一致(默认通过 set_password 加密后校验已满足需求),可以自定义认证后端:

在应用下创建 backends.py 文件:

from django.contrib.auth.backends import ModelBackend
from .models import CustomUser

class CodeBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = CustomUser.objects.get(username=username)
            # 同时校验加密后的密码与原始code
            if user.check_password(password) and user.code == password:
                return user
        except CustomUser.DoesNotExist:
            return None

然后在 settings.py 中配置认证后端:

AUTHENTICATION_BACKENDS = [
    "你的应用名.backends.CodeBackend",
    "django.contrib.auth.backends.ModelBackend",
]

4. 执行数据库迁移

运行以下命令完成模型同步:

python manage.py makemigrations
python manage.py migrate

使用示例

创建用户实例后即可直接用 username 和 code 进行认证:

from django.contrib.auth import authenticate
from .models import CustomUser

# 创建用户
CustomUser.objects.create_user(username="test_user", code="test_code_123")

# 认证用户
user = authenticate(username="test_user", password="test_code_123")
# 认证成功返回用户实例,失败返回None

内容的提问来源于stack exchange,提问作者Shervin.bdn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:33:07