Django中authenticate无法验证自定义用户表,登录始终失败
Django自定义用户表登录
authenticate()验证失败排查方案 以下是针对自定义signup用户表登录验证失败的核心排查与解决步骤:
1. 确认自定义用户模型的全局配置
- 必须在
settings.py中指定自定义用户模型,否则Django会默认使用内置的auth.User表进行验证:AUTH_USER_MODEL = '你的应用名.signup'
2. 检查自定义用户模型的基础实现
- 确保模型继承自
AbstractBaseUser或AbstractUser,并正确设置登录标识字段:from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin class signup(AbstractBaseUser, PermissionsMixin): email = models.EmailField(unique=True) username = models.CharField(max_length=30) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) # 指定用email作为登录字段 USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['username'] objects = SignupManager() # 必须绑定自定义管理器 def get_full_name(self): return self.username def get_short_name(self): return self.username
3. 验证自定义用户管理器的正确性
如果继承AbstractBaseUser,必须自定义管理器并实现密码加密逻辑:
class SignupManager(BaseUserManager): def create_user(self, email, password=None, **extra_fields): if not email: raise ValueError('必须填写邮箱') email = self.normalize_email(email) user = self.model(email=email, **extra_fields) user.set_password(password) # 关键:用set_password加密密码 user.save(using=self._db) return user def create_superuser(self, email, password=None, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) return self.create_user(email, password, **extra_fields)
4. 检查登录视图的参数匹配
- 如果用邮箱作为登录标识,
authenticate()必须传入对应字段参数,而非默认的username:from django.contrib.auth import authenticate, login from django.contrib import messages from django.shortcuts import redirect, render def login_data(request): if request.method == 'POST': email = request.POST.get('email') password = request.POST.get('password') # 注意参数是email,不是username user = authenticate(request, email=email, password=password) if user is not None: login(request, user) return redirect('index') else: messages.error(request, '无效凭证') return render(request, 'login.html')
5. 确认注册时密码的加密逻辑
注册功能必须使用set_password()存储加密密码,禁止直接明文存储:
def signup_data(request): if request.method == 'POST': email = request.POST.get('email') username = request.POST.get('username') password = request.POST.get('password') # 正确的密码加密方式 user = signup.objects.create(email=email, username=username) user.set_password(password) user.save() return redirect('login') return render(request, 'signup.html')
6. 检查数据库存储的密码格式
直接查看signup表的password字段,正常加密后的密码格式应为pbkdf2_sha256$xxx$xxx,如果是明文则说明注册时未加密,导致验证失败。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

