Django自定义用户模型后如何彻底移除密码表单?
彻底移除所有场景下的密码表单解决方案
1. 调整用户模型(models.py)
确保自定义用户模型完全剔除密码依赖,移除密码字段并修改管理器逻辑:
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin from django.db import models class CustomUserManager(BaseUserManager): def create_user(self, username, face_data, **extra_fields): if not username: raise ValueError('用户名必须填写') user = self.model(username=username, face_data=face_data, **extra_fields) user.save(using=self._db) return user def create_superuser(self, username, face_data, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) return self.create_user(username, face_data, **extra_fields) class CustomUser(AbstractBaseUser, PermissionsMixin): username = models.CharField(max_length=150, unique=True) face_data = models.BinaryField() # 存储人脸特征数据 is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) USERNAME_FIELD = 'username' REQUIRED_FIELDS = ['face_data'] # 移除password objects = CustomUserManager()
2. 修改表单类(forms.py)
登录表单:完全移除密码字段
from django import forms from django.contrib.auth.forms import AuthenticationForm from .models import CustomUser class CustomAuthenticationForm(AuthenticationForm): password = None class Meta: model = CustomUser fields = ['username']
注册表单:删除密码及确认字段
from django.contrib.auth.forms import UserCreationForm from .models import CustomUser class CustomUserCreationForm(UserCreationForm): password1 = None password2 = None class Meta: model = CustomUser fields = ['username', 'face_data']
3. 调整认证后端(authentication.py)
让认证逻辑仅依赖用户名和人脸匹配,完全忽略密码:
from django.contrib.auth.backends import BaseBackend from .models import CustomUser # 替换为你实际使用的人脸库,比如face_recognition import face_recognition class FaceAuthBackend(BaseBackend): def authenticate(self, request, username=None, face_image=None, **kwargs): try: user = CustomUser.objects.get(username=username) # 人脸匹配逻辑示例 stored_encoding = face_recognition.face_encodings(user.face_data)[0] input_encoding = face_recognition.face_encodings(face_image)[0] if face_recognition.compare_faces([stored_encoding], input_encoding)[0]: return user except CustomUser.DoesNotExist: return None def get_user(self, user_id): try: return CustomUser.objects.get(pk=user_id) except CustomUser.DoesNotExist: return None
4. 配置Admin后台(admin.py)
自定义用户管理界面,移除所有密码相关字段:
from django.contrib import admin from django.contrib.auth.admin import UserAdmin from .models import CustomUser from .forms import CustomUserCreationForm, CustomUserChangeForm class CustomUserAdmin(UserAdmin): add_form = CustomUserCreationForm form = CustomUserChangeForm model = CustomUser list_display = ['username', 'is_staff', 'is_active'] fieldsets = ( (None, {'fields': ('username', 'face_data')}), ('权限设置', {'fields': ('is_staff', 'is_active', 'is_superuser', 'groups', 'user_permissions')}), ('重要日期', {'fields': ('last_login', 'date_joined')}), ) add_fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('username', 'face_data', 'is_staff', 'is_active')} ), ) admin.site.register(CustomUser, CustomUserAdmin)
5. 更新settings.py配置
指定自定义用户模型和认证后端:
AUTH_USER_MODEL = '你的应用名.CustomUser' AUTHENTICATION_BACKENDS = [ '你的应用名.authentication.FaceAuthBackend', ]
6. 调整前端视图与模板
- 登录视图:接收用户名和人脸图像,调用自定义认证逻辑
- 登录/注册模板:仅渲染用户名、人脸上传字段,删除所有密码相关表单元素
内容的提问来源于stack exchange,提问作者Konstantin
相关产品推荐
相关产品推荐

