У меня есть приложение Django, которое свободно использует django.contrib.auth.decorators.login_required()
, а также django.views.decorators.http.require_http_methods()
.Первый является декоратором, который проверяет, вошел ли текущий пользователь в систему, и перенаправляет его (с кодом 302, IIRC) на страницу входа в систему, если он не вошел в систему. Последний является декоратором, который проверяет метод запроса и возвращает 405 (методне реализовано), если метод отсутствует в переданном списке.Так, в качестве примера, функция представления может выглядеть следующим образом:
@require_http_methods(["GET", "POST", "DELETE"])
@login_required
def my_view(request):
...
Вот проблема: многие из этих представлений выполняют внутренние проверки разрешений, которые возвращают 403 (запрещено), если у пользователя недостаточно разрешений для ресурса.Согласно моим исследованиям, это плохо, потому что 403 должно произойти до проверки правильности метода.Однако без login_required()
мне пришлось бы открывать код, который пользователь также проверяет в моих представлениях.
Кто-нибудь еще испытывал это?Есть ли правильный ответ?Я знаю, что это мошенничество, но недопустимо ли проверять методы, затем перенаправлять вход в систему, затем, наконец, проверять права пользователей или мне нужно реструктурировать эти представления?