Can';t登录到Django管理面板
Made custom user,Made custom user manager,无法登录到Django管理面板 已尝试(表示不提供):Can';t登录到Django管理面板,django,django-rest-framework,Django,Django Rest Framework,Made custom user,Made custom user manager,无法登录到Django管理面板 已尝试(表示不提供): manage.py已同步 manage.py createsuperuser 已检查我的用户是否为工作人员且处于活动状态 将身份验证\u后端设置为“django.contrib.auth.BACKENDS.modelbend” 设置AUTH\u USER\u MODEL='users.USER' DB-postgres,im也使用rest框架 mode
- manage.py已同步
- manage.py createsuperuser
- 已检查我的用户是否为工作人员且处于活动状态
- 将身份验证\u后端设置为“django.contrib.auth.BACKENDS.modelbend”
- 设置AUTH\u USER\u MODEL='users.USER'
from django.contrib.auth.base_user import BaseUserManager, AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.db import models, transaction
# Create your models here.
class UserManager(BaseUserManager):
"""
Custom user model manager where email is the unique identifiers
for authentication instead of usernames.
"""
def create_user(self, deviceId, **extra_fields):
"""
Create and save a User with the given email and password.
"""
if not deviceId:
raise ValueError('The device id must be set')
user = self.model(deviceId=deviceId, **extra_fields)
user.save()
return user
def create_superuser(self, deviceId, **extra_fields):
"""
Create and save a SuperUser with the given email and password.
"""
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_active', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self.create_user(deviceId, **extra_fields)
class User(AbstractBaseUser, PermissionsMixin):
deviceId = models.TextField(max_length=255, unique=True, db_column='device_id')
email = models.EmailField(max_length=255, unique=True, null=True)
password = models.CharField(max_length=255, blank=True, null=True)
name = models.CharField(max_length=255, db_column='name')
fcmToken = models.TextField(blank=True, null=True, db_column='fcm_token')
picture = models.ImageField(upload_to='UserAvatars', null=True)
pictureUrl = models.URLField(null=True, blank=True, db_column='picture_url')
emailToken = models.TextField(max_length=255, db_column='email_token', blank=True, null=True)
appleId = models.TextField(max_length=255, db_column='apple_id', blank=True, null=True)
googleId = models.TextField(max_length=255, db_column='google_id', blank=True, null=True)
facebookId = models.TextField(max_length=255, db_column='facebook_id', blank=True, null=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'deviceId'
REQUIRED_FIELDS = []
def save(self, *args, **kwargs):
super(User, self).save(*args, **kwargs)
return self
def get_full_name(self):
return self.name
def get_short_name(self):
return self.name
问题是在
create\u user
方法中没有正确处理密码。密码显然应该是散列的。当您编写self.model(deviceId=deviceId,**额外字段)
时,您只需将从用户收到的纯文本值设置为密码
当一个人试图验证Django时,他会对收到的密码进行哈希运算,并尝试将其与数据库中的值相匹配,这显然会失败。作为参考检查,它是如何在内置用户模型中设置密码的
要解决此问题,您必须更改create\u user
和create\u superuser
方法,如下所示:
从django.contrib.auth.hasher导入make\u密码
def create_user(自我、设备ID、密码、**额外_字段):
"""
使用给定的电子邮件和密码创建并保存用户。
"""
如果不是deviceId:
raise VALUERROR('必须设置设备id')
user=self.model(deviceId=deviceId,**额外字段)
user.password=生成密码(password)
user.save()
返回用户
def create_超级用户(自我、设备ID、密码、**额外_字段):
"""
使用给定的电子邮件和密码创建并保存超级用户。
"""
额外字段。setdefault('is_staff',True)
extra_fields.setdefault('is_superuser',True)
额外字段。setdefault('is_active',True)
如果extra_fields.get('is_staff')不正确:
raise VALUERROR('超级用户必须具有is\u staff=True')
如果extra_fields.get('is_superuser')不为True:
raise VALUE ERROR('超级用户必须具有is\U Superuser=True')
返回self.create_user(设备ID、密码、**额外_字段)
注意:也不要为密码设置max_length=255
。无论提供多长时间的密码,都只需要128个字符
由于散列而存储在数据库中。所以,你应该设置
密码字段上的最大长度=128
我非常怀疑您的自定义用户模型是否能够针对“django.contrib.auth.backends.modelbend”进行身份验证,因为此后端是专门为内置django用户模型创建的。您可能需要自定义身份验证后端。:)user.set_密码(password)有帮助吗?