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