Кэш пользовательских прав в 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? Как я могу продолжать использовать мою пользовательскую логику разрешений во время тестирования?