Невозможно войти в систему суперпользователей, созданных в бэкэнде администратора django - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь создать суперпользователей на бэкэнде администратора django, но почему-то не могу заставить их войти в систему. Вот мой класс пользователя,

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True, max_length=255)
    mobile = PhoneNumberField(null=True)
    username = models.CharField(null=False, unique=True, max_length=255)
    full_name = models.CharField(max_length=255, blank=True, null=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)


    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']
    objects = UserManager()

Вот функция UserManager для создания суперпользователя,

class UserManager(BaseUserManager):

    def create_user(self, email, mobile=None, username=None, full_name=None, gender=None, birthday=None, password=None,
                    is_staff=False,
                    is_superuser=False, is_active=False, is_mobile_verified=False, is_bot=False, is_online=False,
                    is_logged_in=True):
        if not email:
            raise ValueError("Can't create User without a mobile number!")
        if not password:
            raise ValueError("Can't create User without a password!")
        user = self.model(
            email=self.normalize_email(email),
            mobile=mobile,
            username=username,
            full_name=full_name,
            gender=gender,
            birthday=birthday,
            is_staff=is_staff,
            is_superuser=is_superuser,
            is_active=is_active, 

        )
        user.set_password(password)
        return user

    def create_superuser(self, email, username, password=None):
        user = self.create_user(
            email,
            username=username,
            password=password,
            is_staff=True,
            is_superuser=True,
            is_active=True,
        )
        user.save(self._db)
        return user

    @property
    def is_superuser(self):
        return self.is_superuser

    @property
    def is_staff(self):
        return self.is_staff

    @property
    def is_active(self):
        return self.is_active

    @property
    def is_mobile_verified(self):
        return self.is_mobile_verified

    def has_perm(self, perm, obj=None):
        return self.is_staff or self.is_superuser

    def has_module_perms(self, app_label):
        return self.is_staff or self.is_superuser


    @is_staff.setter
    def is_staff(self, value):
        self._is_staff = value

    @is_superuser.setter
    def is_superuser(self, value):
        self._is_superuser = value

    @is_active.setter
    def is_active(self, value):
        self._is_active = value

Вот соответствующие настройки бэкэнда.

OAUTH2_PROVIDER = {
    # this is the list of available scopes
    'ACCESS_TOKEN_EXPIRE_SECONDS': 60 * 60 * 24,
    'SCOPES': {'read': 'Read scope', 'write': 'Write scope', 'groups': 'Access to your groups'},
    'OAUTH2_BACKEND_CLASS': 'oauth2_provider.oauth2_backends.JSONOAuthLibCore',
}

AUTHENTICATION_BACKENDS = (
        'django.contrib.auth.backends.ModelBackend',
)

# REST Framework
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
}

Я проверяю is_staff и is_superuser на true в форме создания, все еще ничего. Созданный суперпользователь не может войти в систему администратора. Что я тут не так делаю.

Ответы [ 2 ]

0 голосов
/ 08 июля 2018

Я создал новый проект с вашим кодом и не могу воспроизвести вашу проблему. Все отлично работает на моей стороне. Тем не менее, я заметил несколько вещей в вашем коде:

Сначала, в вашем settings.py, убедитесь, что вы установили AUTH_USER_MODEL в your_app.User.

Во-вторых, в вашем UserManager классе я нашел следующие вещи:

@property
def is_staff(self):
    return self.is_staff

Для меня это похоже на ошибку, поскольку это приводит к бесконечным рекурсиям. Я полагаю, что в вашем случае в коде django есть всеобъемлющее предложение, поэтому RecursionError отключается. Скорее всего, это проблема.

0 голосов
/ 07 июля 2018

Во-первых, Вы используете пользовательскую модель пользователя. В своем файле настроек вы говорите django использовать вашу модель вместо auth.models.User по умолчанию?

Второй,

вы вызываете self.create_user внутри своей функции create_superuser.

Вы также переопределяете функцию create_user?

Если да, пожалуйста, укажите реализацию.

Обновление

Вам не нужно менять функции реализации mansger, как вы это сделали. Если вы посмотрите на реализацию UserManger в django.auth.models. Оттуда вы можете черпать вдохновение и избежать ошибки - например: вы не сохраняете модель, когда создаете стандартного пользователя, а не вызываете метод сохранения.

Я предлагаю изменить свой UserManager следующим образом:

class UserManager(BaseUserManager):

    use_in_migrations = True

    def _create_user(self, email, password, 
**extra_fields):

        if not email:
            raise ValueError('The given email must be set')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):

        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        extra_fields.setdefault('is_active', False)

        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):

        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', 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(email, password, **extra_fields)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...