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

