Проблема, связанная с правами администратора django для учетных записей не суперпользователя
В настоящее время у меня возникла проблема с проектом, использующим django 1.3.1 и его интерфейс администратора (просто ваше дружелюбное окружение django.contrib.admin). Проект продолжается некоторое время, и единственными учетными записями со статусом персонала всегда были учетные записи суперпользователя.
Это изменилось. Клиент запросил учетные записи с более детальными настройками разрешений. Я попытался настроить это, отключив статус суперпользователя для указанных учетных записей и вручную установив соответствующие права. Кажется, что интерфейс администратора полностью игнорирует указанные вручную права, когда пользователь входит в систему. Даже со всеми указанными правами пользователю отказано в доступе к любому контенту (хотя он все еще может войти в интерфейс администратора).
эта проблема, похоже, не связана с версией django, потому что я попробовал быстрое временное обновление до 1.3.3 и даже до 1.4. Неудачно...
У меня нет проблем с тем, чтобы поделиться частью кода проекта, чтобы помочь отследить проблему, но, честно говоря, я не могу понять, в чем проблема. Я был бы очень признателен за некоторые советы.
2 ответа
Вот пример решения этой проблемы, основанный на ответе yassam выше. Код, который у меня был, вызывал проблему:
class MyCustomModelBackend(object):
def authenticate(self, username=None, password=None):
try:
user = User.objects.get(username__iexact=username)
if user.check_password(password):
return user
except User.DoesNotExist:
return None
Чтобы решить эту проблему, обновите ее, чтобы извлечь из django.contrib.auth.backends.ModelBackend
:
from django.contrib.auth.backends import ModelBackend
class MyCustomModelBackend(ModelBackend):
def authenticate(self, username=None, password=None):
try:
user = User.objects.get(username__iexact=username)
if user.check_password(password):
return user
except User.DoesNotExist:
return None
Используете ли вы свой собственный сервер аутентификации? Если это так, ваш бэкэнд-класс является производным от django.contrib.auth.backends.ModelBackend?
Сегодня я обнаружил ту же проблему в своем коде, и проблема оказалась в том, что мой бэкэнд был получен из объекта. В частности, мой бэкэнд не реализовал некоторые функции, используемые кодом администратора (например, has_module_perms).
Либо получайте свой бэкэнд из django.contrib.auth.backends.ModelBackend, либо убедитесь, что все функции, необходимые для кода администратора, определены в вашем бэкенде.