Кэш пользовательских прав в Django-Webtest

Мой проект использует пользовательский бэкенд аутентификации для управления правами пользователей, оставляя саму аутентификацию нетронутой (обрабатывается Django). Бэкенд прекрасно работает сам по себе, но начал давать сбои в тестах, построенных с помощью Django WebTest. Покопавшись, я обнаружил, что виной всему является внедрение DWT другого бэкенда аутентификации в первую позицию в settings.AUTHENTICATION_BACKENDS.

Мой бэкенд непосредственно расширяет ModelBackend от Django, в то время как собственный бэкенд DWT основан на RemoteUserBackend, который в конечном итоге также является расширением ModelBackend. Этот бит важен, потому что, хотя DWT не определяет метод has_perm, он все же присутствует в его бэкенде.

При выполнении django.contrib.auth.backends.ModelBackend теста get_all_permissions() кэшируются разрешения на рассматриваемый объект пользователя.

    if not hasattr(user_obj, '_perm_cache'):
        user_obj._perm_cache = {
            *self.get_user_permissions(user_obj),
            *self.get_group_permissions(user_obj),
        }
    return user_obj._perm_cache

Поскольку бэкенд DWT стоит на первом месте в тестах, кэш заполняется и не содержит разрешений, установленных моим бэкендом, что в конечном итоге приводит к неудаче теста has_perm. Приведем фрагмент кода из Django:

def _user_has_perm(user, perm, obj):
    """
    A backend can raise `PermissionDenied` to short-circuit permission checking.
    """
    for backend in auth.get_backends():
        if not hasattr(backend, 'has_perm'):
            continue
        try:
            if backend.has_perm(user, perm, obj):
                return True
        except PermissionDenied:
            return False
    return False

Я делаю что-то не так в моем бэкенде или это недосмотр авторов DWT? Как я могу продолжать использовать мою пользовательскую логику разрешений во время тестирования?

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