Проблема, связанная с правами администратора 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, либо убедитесь, что все функции, необходимые для кода администратора, определены в вашем бэкенде.

Другие вопросы по тегам