Django удаляет разрешение "is_staff", если я пытаюсь войти в систему

У меня довольно странная ситуация в моем проекте django. У меня есть LoginForm, где пользователь может войти на сайт. Я использую django 3.2.12 с некоторыми другими библиотеками, такими как django-crispy-forms и так далее.

Я реализовал django-crowd-auth, чтобы пользователи могли получить доступ к странице с помощью крауда. Я сделал необходимые конфигурации в settings.py и приложение работает без проблем.

После этого я дал существующему пользователю is_staff и is_superuser права доступа к администрированию django.

Я делал это следующим образом:

python manage.py shell
>>> from django.contrib.auth.models import User
>>> user = User.objects.get(username="<myuser>")
>>> user.is_staff = True
>>> user.is_superuser = True
>>> print(user.is_staff)
True
>>> print(user.is_superuser)
True
>>> user.save()

После этого я перезапускаю свое приложение django следующим образом:

 sudo <path_to_conda_env_python>/python manage.py runsslserver --certificate <crt-file> --key <pem-file> 0.0.0.0:88

Если я пытаюсь войти в административную панель django с пользователем, которому я только что дал права, я получаю ошибку

"Пожалуйста, введите правильное имя пользователя и пароль для учетной записи персонала. Обратите внимание, что оба поля могут быть регистрозависимыми"

Возврат к оболочке django дает мне следующий результат

python manage.py shell
>>> from django.contrib.auth.models import User
>>> user = User.objects.get(username="<myuser>")
>>> print(user.is_staff)
False
>>> print(user.is_superuser)
False

Кажется, что django сбрасывает мои разрешения каждый раз, когда я пытаюсь войти в систему. Но почему?

То, что я уже пробовал:

  • Создание нового пользователя и предоставление ему is_staff и is_superuser разрешений
  • Запуск python manage.py shell с помощью sudo

В документации по django crowd auth говорится, что переменная CROWD_USERS_ARE_STAFF по умолчанию установлена в значение false. Это нормально, потому что вновь созданные пользователи не должны иметь права доступа к странице администратора. Но это не может быть причиной проблемы, верно?

Кто-нибудь работал с аутентификацией толпы и имеет какие-то идеи?

Редактирование опечатка изменено save() на user.save()

Я нашел временное решение своей проблемы. Я изменил логику в блоке try внутри скрипта user.py. Изменение исходных скриптов, возможно, не лучший способ, но для тестирования это подходит.

def from_data(client, data):
    """Get a Django user from a Crowd user data.
    """
    username = data['name']
    is_active = getattr(settings, 'CROWD_USERS_ARE_ACTIVE', True)
    superusers_group = getattr(settings, 'CROWD_SUPERUSERS_GROUP', None)
    is_superuser = False
    groups = []

    for group_name in client.get_nested_groups(username):
        if superusers_group and group_name == superusers_group:
            is_superuser = True

        try:
            group = Group.objects.get(name=group_name)
        except ObjectDoesNotExist:
            group = Group.objects.create(name=group_name)
            LOGGER.info('Group %s created', group_name)

        groups.append(group)

    is_staff = getattr(settings, 'CROWD_USERS_ARE_STAFF', is_superuser)

    try:
        user = get_user_model().objects.get(username=username)
        if username==<your_username>:
            user.is_staff=True
            user.is_superuser=True
            user.save()

    except ObjectDoesNotExist:
        user = get_user_model().objects.create(
            username=username,
            first_name=data.get('first-name'),
            last_name=data.get('last-name'),
            email=data.get('email'),
            is_active=is_active,
            is_staff=is_staff,
            is_superuser=is_superuser)
        group = Group.objects.get(name='LinMaps_Light')
        user.groups.add(group)
        LOGGER.info('User %s created', username)

    return user
Вернуться на верх